如何理解这些函数中的字节顺序:'writeFloatLE'、'writeFloatBE'、'writeDoubleLE'、'writeDoubleBE'

How to understand endianness in these function: 'writeFloatLE', 'writeFloatBE', 'writeDoubleLE', 'writeDoubleBE'

我知道字节序,比如0xdead(使用writeIntLE)可以转换为ad de

但是,在这些演示中:

var buf = new Buffer(4);
buf.writeFloatBE(0xcafebabe, 0);

console.log(buf);

buf.writeFloatLE(0xcafebabe, 0);
console.log(buf);

// <Buffer 4f 4a fe bb>
// <Buffer bb fe 4a 4f>

var buf = new Buffer(8);
buf.writeDoubleBE(0xdeadbeefcafebabe, 0);

console.log(buf);

buf.writeDoubleLE(0xdeadbeefcafebabe, 0);

console.log(buf);

// <Buffer 43 eb d5 b7 dd f9 5f d7>
// <Buffer d7 5f f9 dd b7 d5 eb 43>

我不知道如何将 0xcafebabe 转换为 4f 4a fe bbbb fe 4a 4f。 请帮助我理解步骤。

这与字节顺序无关(或不大)。您将一个以十六进制形式编写的数字传递给 writeDoublewriteFloat,这会将其转换为 32 位或 64 位浮点表示形式。也就是说,您观察到的转换主要是从无符号整数到 floating-point.

浮点数表示一个数字表示为m×10e 其中me 是带符号的整数(嗯,从技术上讲,符号存储在单独的符号位中)。

在 64 位浮点数的情况下,53 位用于数字 m,其余 (11) 位编码指数 e 。 JavaScript 只有一个 number 类型,即 64 位浮点数。因此,它的精度只有 53 位(52 位无符号),这意味着它不能以全精度存储 64 位整数,顺便说一下。

解析您的代码时,JavaScript 解释器会将数字文字(例如十六进制文字)转换为其内部 64 位浮点表示形式。 数字在运行时传递给 writeWhatever,而不是原始整数。我希望如果它是 writeDouble 则不会有任何额外的转换(可能只是字节重新排序)。