由于您正在从十进制转换为字节,因此除以 256 是一个非常容易模拟的操作,可以通过将字符串中的数字分成几部分来模拟。我们可以利用两个数学规则。
- 十进制数的最右边 n 位可以确定可被 2^n 整除。
- 10^n 总是能被 2^n 整除。
因此,我们可以将这个数字从最右边的 8 位数字中分离出来以找到余数(即& 255
),将右边的部分除以 256,然后将数字的左边部分分别除以 256。左边的余数可以通过公式 移到数字的右边(最右边的 8 位)n*10^8 \ 256 = (q*256+r)*10^8 \ 256 = q*256*10^8\256 + r*10^8\256 = q*10^8 + r*5^8
,其中\
是整数除法,q
和r
分别是商和余数n \ 256
。这产生了以下方法,对长度不超过 23 位(15 正常 JS 精度 + 8 额外产生的此方法)的字符串进行整数除以 256:
function divide256(n)
{
if (n.length <= 8)
{
return (Math.floor(parseInt(n) / 256)).toString();
}
else
{
var top = n.substring(0, n.length - 8);
var bottom = n.substring(n.length - 8);
var topVal = Math.floor(parseInt(top) / 256);
var bottomVal = Math.floor(parseInt(bottom) / 256);
var rem = (100000000 / 256) * (parseInt(top) % 256);
bottomVal += rem;
topVal += Math.floor(bottomVal / 100000000); // shift back possible carry
bottomVal %= 100000000;
if (topVal == 0) return bottomVal.toString();
else return topVal.toString() + bottomVal.toString();
}
}
从技术上讲,这可以实现为将任意大小的整数除以 256,只需将数字递归地分成 8 位部分并使用相同的方法分别处理每个部分的除法。
45035997012373300
这是一个为您的示例编号 ( )计算正确字节数组的工作实现:http: //jsfiddle.net/kkX2U/。
[52, 47, 7, 44, 0, 0, 160, 0]