javascript - 将 32 位无符号整数转换为大端字节数组的最稳定方法?

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

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

输入值: 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) 转换,但我认为人们可能对每个数的十进制数表示感兴趣字节所以将其留到稍后阶段..

关于javascript - 将 32 位无符号整数转换为大端字节数组的最稳定方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43327162/

相关文章:

node.js - 连续登录后 Passport context.req.user 未定义(express/graphql)

javascript - 来自 Protractor 测试的纯 HTTP 调用

javascript - 在 vorpal Action 期间调用另一个函数

arrays - 将函数映射到haskell中的列表/数组?

c - 如何从 char* 函数返回 char*

javascript - 为什么 jQuery Ajax 在 Post 之前发送 Get 请求?

javascript - 使用 Web Audio API 创建 10 波段均衡器

java - 数组常量只能在初始化器中使用

javascript - 显示多个 div 的输入内容

javascript - YQL - 无法返回 yql 结果