找不到以下输出的共鸣

问题描述 投票:0回答:1
let bytes = new Uint16Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
let view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
let int = view.getUint32(0);   // Read big-endian unsigned int from byte 0
console.log(1, int);
int = view.getUint32(4, false); // Next int is also big-endian
console.log(2, int);
int = view.getUint32(8, true); // Next int is little-endian and unsigned
console.log(3, int);
view.setUint32(8, int, false); // Write it back in big-endian format
int = view.getUint32(8, false);
console.log(4, int);

输出: 1256, 2 33555200, 3 327684, 4 327684

我已将所有输出从有符号更改为无符号,但无法理解结果。

在第一种情况下,大端字节序中的前 4 个字节在二进制中预计为 00 00 00 01 那么为什么是 256?

javascript endianness typed-arrays
1个回答
0
投票

在第一种情况下,大尾数中的前 4 个字节预计为 00 00 00 01

这取决于平台。正如 Mozilla 贡献者所写 on Uint16Array

Uint16Array 类型数组表示平台字节顺序的 16 位无符号整数数组。

因此字节可以按以下顺序存储:

00 00 01 00 02 00 03 00
,对应于 16 位值(2 个字节)的小端存储。 Little-endian 是最常见的。

然后,当以大端字节序读取前 4 个字节时,最后一个字节表示 256 的倍数。

这解释了您得到的前两个输出:

00 00 01 00 02 00 03 00
----------- ----------- 
     ↓           ↓
   0x100     0x2000300
    256      33555200
© www.soinside.com 2019 - 2024. All rights reserved.