function intFromBytes( x ){
var val = 0;
for (var i = 0; i < x.length; ++i) {
val += x[i];
if (i < x.length-1) {
val = val << 8;
}
}
return val;
}
function getInt64Bytes( x ){
var bytes = [];
var i = 8;
do {
bytes[--i] = x & (255);
x = x>>8;
} while ( i )
return bytes;
}
Run Code Online (Sandbox Code Playgroud)
我试图将javascript编号转换为字节数组,然后返回到数字.但是,上述功能会产生非常大数量的错误输出.
var array = getInt64Bytes(23423423);
var value = intFromBytes(array);
console.log(value); //Prints 23423423 - correct
var array = getInt64Bytes(45035996273704);
var value = intFromBytes(array);
console.log(value); //Prints -1030792152 - incorrect
Run Code Online (Sandbox Code Playgroud)
据我所知,javascript浮动是53位所以它不应该溢出?警报(Math.pow(2,53))工作正常.
You*_*nes 42
使用Susanoh13提供的提示,这里有两个函数允许从/到ByteArray转换数字:
longToByteArray = function(/*long*/long) {
// we want to represent the input as a 8-bytes array
var byteArray = [0, 0, 0, 0, 0, 0, 0, 0];
for ( var index = 0; index < byteArray.length; index ++ ) {
var byte = long & 0xff;
byteArray [ index ] = byte;
long = (long - byte) / 256 ;
}
return byteArray;
};
byteArrayToLong = function(/*byte[]*/byteArray) {
var value = 0;
for ( var i = byteArray.length - 1; i >= 0; i--) {
value = (value * 256) + byteArray[i];
}
return value;
};
Run Code Online (Sandbox Code Playgroud)
try(**是幂运算符,<<并且>>>是位移运算符) -intFromBytes仅适用于从正整数生成的数组
function getInt64Bytes(x) {
let y= Math.floor(x/2**32);
return [y,(y<<8),(y<<16),(y<<24), x,(x<<8),(x<<16),(x<<24)].map(z=> z>>>24)
}
function intFromBytes(byteArr) {
return byteArr.reduce((a,c,i)=> a+c*2**(56-i*8),0)
}
Run Code Online (Sandbox Code Playgroud)
function getInt64Bytes(x) {
let y= Math.floor(x/2**32);
return [y,(y<<8),(y<<16),(y<<24), x,(x<<8),(x<<16),(x<<24)].map(z=> z>>>24)
}
function intFromBytes(byteArr) {
return byteArr.reduce((a,c,i)=> a+c*2**(56-i*8),0)
}
Run Code Online (Sandbox Code Playgroud)
2022年,你应该使用Buffer来处理字节,使用BigInt来处理大整数。
所以你的代码可能如下所示:
import { Buffer } from "node:buffer";
/**
* @param {BigInt} x
* @returns {Buffer}
*/
function getInt64Bytes(x) {
const bytes = Buffer.alloc(8);
bytes.writeBigInt64LE(x);
return bytes;
}
/**
* @param {Buffer} x
* @returns {BigInt}
*/
function intFromBytes(x) {
return x.readBigInt64LE();
}
var array = getInt64Bytes(BigInt(23423423));
var value = intFromBytes(array);
console.log(value); // 23423423n
var array = getInt64Bytes(BigInt(45035996273704));
var value = intFromBytes(array);
console.log(value); // 45035996273704n
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66350 次 |
| 最近记录: |