如何理解这些函数中的字节顺序:'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 bb
或 bb fe 4a 4f
。
请帮助我理解步骤。
这与字节顺序无关(或不大)。您将一个以十六进制形式编写的数字传递给 writeDouble
或 writeFloat
,这会将其转换为 32 位或 64 位浮点表示形式。也就是说,您观察到的转换主要是从无符号整数到 floating-point.
浮点数表示一个数字表示为m×10e 其中m 和 e 是带符号的整数(嗯,从技术上讲,符号存储在单独的符号位中)。
在 64 位浮点数的情况下,53 位用于数字 m,其余 (11) 位编码指数 e 。 JavaScript 只有一个 number 类型,即 64 位浮点数。因此,它的精度只有 53 位(52 位无符号),这意味着它不能以全精度存储 64 位整数,顺便说一下。
解析您的代码时,JavaScript 解释器会将数字文字(例如十六进制文字)转换为其内部 64 位浮点表示形式。 数字在运行时传递给 writeWhatever
,而不是原始整数。我希望如果它是 writeDouble
则不会有任何额外的转换(可能只是字节重新排序)。
我知道字节序,比如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 bb
或 bb fe 4a 4f
。
请帮助我理解步骤。
这与字节顺序无关(或不大)。您将一个以十六进制形式编写的数字传递给 writeDouble
或 writeFloat
,这会将其转换为 32 位或 64 位浮点表示形式。也就是说,您观察到的转换主要是从无符号整数到 floating-point.
浮点数表示一个数字表示为m×10e 其中m 和 e 是带符号的整数(嗯,从技术上讲,符号存储在单独的符号位中)。
在 64 位浮点数的情况下,53 位用于数字 m,其余 (11) 位编码指数 e 。 JavaScript 只有一个 number 类型,即 64 位浮点数。因此,它的精度只有 53 位(52 位无符号),这意味着它不能以全精度存储 64 位整数,顺便说一下。
解析您的代码时,JavaScript 解释器会将数字文字(例如十六进制文字)转换为其内部 64 位浮点表示形式。 数字在运行时传递给 writeWhatever
,而不是原始整数。我希望如果它是 writeDouble
则不会有任何额外的转换(可能只是字节重新排序)。