将 32 位无符号整数转换为大端字节数组的最稳定方法?
Most stable way to convert a 32bit unsigned integer to big endian byte array?
如果需要,将给定(无符号)整数转换为具有大端和填充的四字节数组的最稳定和最简单的方法是什么?这是一个例子:
输入值:
714
输出:这个字节数组
[ 0xca, 0x02, 0x00, 0x00 ];
顺便说一句:能够执行此操作的 npm 模块也很好。
背景:我需要这个字节数组作为我通过 node.js 中的 TCP 套接字发送的 XML 消息的前缀。所以我有一个发送缓冲区(一个字节数组),我在其中放置了前缀,然后缓冲区的其余部分填充了 XML 消息的字节。
下面的函数应该给你一个大端格式的字符串。
function toBigEndian(n){
return n.toString(16)
.match(/[\da-f]/g)
.reduceRight((r,c,i,a) => (a.length-i)%2 ? r.concat(c) : (r[r.length-1] = c + r[r.length-1],r),[])
.map(s => s.length === 1 ? 0+s : s)
.reduce((p,c,i,a) => i < a.length-1 ? p + " " + c : p + " " + c + " 00".repeat(~~((4-a.length))));
}
console.log(toBigEndian(714));
console.log(toBigEndian(20171453));
老实说,我不喜欢我的初始代码。然后,根据您的评论,我想出了另一个更简单的解决方案。首先,我使用一种工具以所需的相反顺序将十进制转换为十六进制。它被称为dec2hex
。很简单。
function dec2hex (n){
return n ? [n%256].concat(dec2hex(~~(n/256))) : [];
}
console.log(JSON.stringify(dec2hex(255)));
console.log(JSON.stringify(dec2hex(256)));
console.log(JSON.stringify(dec2hex(714)));
console.log(JSON.stringify(dec2hex(65535)));
console.log(JSON.stringify(dec2hex(65536)));
因此,通过使用上述 dec2hex
工具,我们可以轻松完成我们的工作。
function dec2hex (n){
return n ? [n%256].concat(dec2hex(~~(n/256))) : [];
}
function toBigEndian(n){
var hexar = dec2hex(n);
return hexar.map(h => (h < 16 ? "0x0" : "0x") + h.toString(16))
.concat(Array(4-hexar.length).fill("0x00"));
}
console.log(JSON.stringify(toBigEndian(714)));
您也可以在 dec2hex
函数中包含十进制数中的十六进制数到十六进制数中的十六进制数 (255 -> 0xff) 转换,但我认为有人可能对每个字节的十进制数表示形式感兴趣所以留到以后再说..
如果需要,将给定(无符号)整数转换为具有大端和填充的四字节数组的最稳定和最简单的方法是什么?这是一个例子:
输入值:
714
输出:这个字节数组
[ 0xca, 0x02, 0x00, 0x00 ];
顺便说一句:能够执行此操作的 npm 模块也很好。
背景:我需要这个字节数组作为我通过 node.js 中的 TCP 套接字发送的 XML 消息的前缀。所以我有一个发送缓冲区(一个字节数组),我在其中放置了前缀,然后缓冲区的其余部分填充了 XML 消息的字节。
下面的函数应该给你一个大端格式的字符串。
function toBigEndian(n){
return n.toString(16)
.match(/[\da-f]/g)
.reduceRight((r,c,i,a) => (a.length-i)%2 ? r.concat(c) : (r[r.length-1] = c + r[r.length-1],r),[])
.map(s => s.length === 1 ? 0+s : s)
.reduce((p,c,i,a) => i < a.length-1 ? p + " " + c : p + " " + c + " 00".repeat(~~((4-a.length))));
}
console.log(toBigEndian(714));
console.log(toBigEndian(20171453));
老实说,我不喜欢我的初始代码。然后,根据您的评论,我想出了另一个更简单的解决方案。首先,我使用一种工具以所需的相反顺序将十进制转换为十六进制。它被称为dec2hex
。很简单。
function dec2hex (n){
return n ? [n%256].concat(dec2hex(~~(n/256))) : [];
}
console.log(JSON.stringify(dec2hex(255)));
console.log(JSON.stringify(dec2hex(256)));
console.log(JSON.stringify(dec2hex(714)));
console.log(JSON.stringify(dec2hex(65535)));
console.log(JSON.stringify(dec2hex(65536)));
因此,通过使用上述 dec2hex
工具,我们可以轻松完成我们的工作。
function dec2hex (n){
return n ? [n%256].concat(dec2hex(~~(n/256))) : [];
}
function toBigEndian(n){
var hexar = dec2hex(n);
return hexar.map(h => (h < 16 ? "0x0" : "0x") + h.toString(16))
.concat(Array(4-hexar.length).fill("0x00"));
}
console.log(JSON.stringify(toBigEndian(714)));
您也可以在 dec2hex
函数中包含十进制数中的十六进制数到十六进制数中的十六进制数 (255 -> 0xff) 转换,但我认为有人可能对每个字节的十进制数表示形式感兴趣所以留到以后再说..