我正在尝试将C#代码转换为nodejs,而且我已经碰壁了。 C#中的一个函数使用一个字节来使用BitConverter.toInt64生成3个数字,如下所示:
var hashText = //Generates Hash from an input here using ComputeHash
var hashCodeStart = BitConverter.ToInt64(hashText, 0);
var hashCodeMedium = BitConverter.ToInt64(hashText, 8);
var hashCodeEnd = BitConverter.ToInt64(hashText, 24);
//Does other stuff with the three pieces here
例如,如果我使用数组:
var hash = new Byte[] {0xAA, 0x9B, 0x50, 0xA7, 0x56, 0x8D, 0x2A, 0x99, 0x87, 0xA7, 0x24, 0x10, 0xF8,0x1E, 0xC3, 0xA2, 0xF9, 0x57, 0x1A, 0x2D, 0x69, 0x89, 0x83, 0x91, 0x2D, 0xFA, 0xA5, 0x4A, 0x4E, 0xA2, 0x81, 0x25};
然后,start,middle和end的值为:
Start : -7409954833570948182
Middle: -6718492168335087737
End : 2702619708542548525
但是使用带有biguinut-format package的NodeJS我得到以下数字(下面的代码):
start : 12293508287479753369
middle : 9774821171531793314
end : 17966858020764353425
使用以下NodeJS
var hexed = "aa9b50a7568d2a9987a72410f81ec3a2f9571a2d698983912dfaa54a4ea28125"
var format = require('biguint-format')
console.log(hexed.toUpperCase().slice(0, 16))
console.log("Start is " + format(hexed.toUpperCase().slice(0, 16), 'dec'))
console.log(hexed.toUpperCase().slice(16, 32))
console.log("Middle is " + format(hexed.toUpperCase().slice(16, 32), 'dec'))
console.log(hexed.toUpperCase().slice(32, 48))
console.log("End is " + format(hexed.toUpperCase().slice(32, 48), 'dec'))
我知道C#的数字由于某些溢出而出现负数,但问题是溢出似乎发生在int64可以存储的最大值之前。
我有没有想知道这是哪个号码,还是以其他方式模仿C#代码?
答案 0 :(得分:4)
你使用一个字符串而不是一个缓冲区并拆分这些你有一个16位数字而不是8个十六进制值的数组我不知道这是否会产生影响或者如果它被转换错误尝试使用记录的方式
var buffer1 = new Buffer([0xAA, 0x9B, 0x50, 0xA7, 0x56, 0x8D, 0x2A, 0x99, 0x87]);
format(buffer1, 'dec', {format:'LE'})
你可能仍然会得到一个uint,所以你需要之后将它转换为signed int
由于@argaz提到BitConverter通常是小端,因此需要LE标志。