【问题标题】:How to reverse bytes order in javascript Uint32如何在javascript Uint32中反转字节顺序
【发布时间】:2016-06-15 15:07:31
【问题描述】:

我需要通过 chrome.sockets.udp 插件发送一个 ArrayBuffer。

数据通过 Android ionic 应用程序发送到在计算机上运行的模拟器。

我需要发送以下字段:

var arrayBuffer = new ArrayBuffer(20);
var dv = new DataView(arrayBuffer,0);

console.log("ID=0 assign");
dv.setUint16(0,0);
console.log("SIZE=12 assign");
dv.setUint16(2,12);
console.log("CRC=0 assign");
dv.setUint16(4,0);
console.log("MSGcount assign");
dv.setUint16(6,0);
console.log("AppVersion assign");
dv.setUint32(8,0);
console.log("Port assign");
dv.setUint32(12,7602);
for (var i = 0; i <= 19; i++) {
  console.log("byte number is " +i+ " "  +dv.getInt8(i));
}
dv.setUint32(16,20000);

当我运行这段代码时,我得到以下结果:

byte number is 12 0
byte number is 13 0
byte number is 14 29
byte number is 15 -78

服务器应该得到下一个结果:

byte number is 12 78
byte number is 13 29
byte number is 14 0
byte number is 15 0

我应该如何在 dataView 中插入数字以按照服务器期望的顺序获取字节?

【问题讨论】:

  • 实际上,服务器的预期结果应该是byte number is 12 178。请记住,该数字设置为无符号,因此应将其检索为无符号。
  • 我需要它是 78,正如服务器所期望的那样,我该怎么做?
  • 要么将原始数字从7602 更改为7502,要么取服务器端第一个字节的绝对值。

标签: javascript google-chrome ionic-framework uint32 byte-shifting


【解决方案1】:

您可以通过将true 设置为setUint32 的第三个参数来反转设置为DataView 的字节的endianness。这将使用“little-endian”排序,并得到您期望的结果:

dv.setUint32(12, 7602, true);

var arrayBuffer = new ArrayBuffer(20);
var dv = new DataView(arrayBuffer, 0);

dv.setUint32(12, 7602, true);

for (var i = 12; i <= 15; i++) {
  console.log("byte number is " + i + " " + dv.getInt8(i));
}

注意:这里的值是负数,因为它是作为 signed int8 访问的。如果您以 unsigned int8 的形式访问,您将看到“正确”的基础值。

【讨论】:

  • 您好,感谢您的回复,但是当我使用dv.getInt8(i) 时,我得到以下结果:byte number is 12 178,为什么不是78?
  • 32位7602的无符号二进制形式是00000000 00000000 00011101 10110010。它只是将每个字节的值显示为无符号数字,即0 0 29 178(使用十进制到二进制转换器自己查看)。当您使用 little-endian 排序时,它会反转这些字节的顺序,因此它将是 10110010 00011101 00000000 00000000 aka 178 29 0 0。如果您将字节视为有符号,它将使用二进制补码转换数字并使用第一位表示正/负。
  • 178-78 具有相同的二进制表示,但是当您使用无符号和有符号时它们的解释不同。
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多