【发布时间】:2023-03-29 18:40:02
【问题描述】:
我在 javaScript 中做一些事情,因此需要将文本字符串转换为十进制。
我使用的php代码是:
function to_number($data)
{
$base = "256";
$radix = "1";
$result = "0";
for($i = strlen($data) - 1; $i >= 0; $i--)
{
$digit = ord($data{$i});
$part_res = bcmul($digit, $radix);
$result = bcadd($result, $part_res);
$radix = bcmul($radix, $base);
}
return $result;
}
因为我需要在 Javascript 中执行此操作,所以我尝试将字符串转换为十六进制,然后转换为十进制字符串:
/// String into Hex
function toHex(str) {
var hex = '';
var i = 0;
while(str.length > i) {
hex += ''+str.charCodeAt(i).toString(16);
i++;
}
return hex;
}
//// Hex into Dec
function h2d(s) {
function add(x, y) {
var c = 0, r = [];
var x = x.split('').map(Number);
var y = y.split('').map(Number);
while(x.length || y.length) {
var s = (x.pop() || 0) + (y.pop() || 0) + c;
r.unshift(s < 10 ? s : s - 10);
c = s < 10 ? 0 : 1;
}
if(c) r.unshift(c);
return r.join('');
}
var dec = '0';
s.split('').forEach(function(chr) {
var n = parseInt(chr, 16);
for(var t = 8; t; t >>= 1) {
dec = add(dec, dec);
if(n & t) dec = add(dec, '1');
}
});
return dec;
}
一切正常,当我用常规字符串提供它们时,php 和 javascript 代码返回完全相同的结果:
thisisasimplestring
但是当输入这样的输入时:
�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�!µ?ŲÀ]).-PSH9Ó·ÂÞ
甚至这个:
�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�yohoo
javascript 代码的结果将与 php 不同。 我需要一个与 php 相同的结果。
有什么想法吗?我正在寻求帮助
【问题讨论】:
-
很难理解到底是什么问题......但也许它与事情的“大整数”方面有关。 JavaScript 只能处理 53 位整数。虽然我不确定为什么 unicode 字符需要这么大的东西。
-
感谢您的评论。虽然我用另一种解决方案解决了这个问题,但由于 javascript 处理字符的方式,我建议阅读这篇文章:mathiasbynens.be/notes/javascript-unicode
标签: javascript regex string bigint