如果需要,将给定(无符号)整数转换为具有大端和填充的四字节数组的最稳定和最简单的方法是什么?这是一个例子:
输入值:
714
输出:此字节数组
[ 0xca, 0x02, 0x00, 0x00 ];
BTW:能够做到这一点的npm模块也没问题。
背景:我需要这个字节数组作为我通过node.js中的TCP套接字发送的XML消息的前缀。所以我有一个发送缓冲区(一个字节数组),我在其中放置了前缀,然后缓冲区的其余部分填充了XML消息的字节。
答案 0 :(得分:1)
以下函数应该为您提供大端格式的字符串。
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)转换十六进制数字包括十六进制数,但我认为可能会对每个字节的十进制数表示感兴趣,所以把它留给后来......