由于您正在从十进制转换为字节,因此通过将字符串中的数字分成部分来模拟除以256的操作非常容易。有两个我们可以利用的数学规则。
- 十进制数的右侧n位数字可以确定2的n次方的可除性。
- 10^n总是可被2^n整除。
因此,我们可以取数字并分离出最右侧的8个数字以找到余数(即& 255
),将右侧部分除以256,然后单独将数字的左侧部分除以256。左侧部分的余数可以按公式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
移入数字的右侧部分(即最右侧的8个数字),其中\
是整数除法,q
和r
分别是n \ 256
的商和余数。这会产生以下方法,以处理长度不超过23个数字(15个普通JS精度+此方法产生的额外8个数字)的字符串的整数除法:
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);
bottomVal %= 100000000;
if (topVal == 0) return bottomVal.toString();
else return topVal.toString() + bottomVal.toString();
}
}
从技术上讲,这可以通过递归地将数字分成8位部分并使用相同的方法分别处理每个部分的除法来实现对任意大小的整数进行256的除法。
以下是一个可行的实现,可以计算出您的示例数字(45035997012373300
)的正确字节数组:http://jsfiddle.net/kkX2U/。
[52, 47, 7, 44, 0, 0, 160, 0]
value
将是一个全局变量。 - Elliot BonnevilleBitConverter.ToInt64(new byte[] {48,47,7,44,0,0,160,0}, 0)
,返回值为45035997012373296
。 - mellamokb