【问题标题】:Most stable way to convert a 32bit unsigned integer to big endian byte array?将 32 位无符号整数转换为大端字节数组的最稳定方法?
【发布时间】:2017-09-05 17:35:34
【问题描述】:

如果需要,将给定(无符号)整数转换为具有大端和填充的四字节数组的最稳定和最简单的方法是什么?这是一个例子:

输入值: 714

输出:这个字节数组 [ 0xca, 0x02, 0x00, 0x00 ];

顺便说一句:能够做到这一点的 npm 模块也可以。

背景:我需要这个字节数组作为我通过 node.js 中的 TCP 套接字发送的 XML 消息的前缀。所以我有一个发送缓冲区(一个字节数组),我在其中放置了前缀,然后缓冲区的其余部分被 XML 消息的字节填充。

【问题讨论】:

  • 您的示例是否没有通过0x2ca 转换为大端到ca 02 00 00..?
  • 你是对的,当然……修好了。谢谢!

标签: javascript arrays node.js type-conversion unsigned-integer


【解决方案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) 转换,但我认为人们可能对每个字节的十进制数字表示感兴趣,所以留下它为以后的阶段..

【讨论】:

  • 谢谢,Redu,这是你拥有的一些真正的魔法! ;) 我会尝试调整您的解决方案,使其返回一个字节数组。我认为我在示例中表述不够清楚,我需要一个字节数组,例如 var myArray = [ 0xca, 0x02, 0x00, 0x00 ];
  • 好的我有点困惑...我可以假设您想用相应的字节值填充一个数组..?我已经对我的答案进行了补充,请检查我是否接近。
  • 是的,这正是我想要实现的。现在可以了,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2019-05-30
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
相关资源
最近更新 更多