【问题标题】:Why is DataView by default in Big Endian?为什么Big Endian默认是DataView?
【发布时间】:2018-04-25 15:06:35
【问题描述】:

谁能解释一下,为什么 DataView 使用字节顺序Big Endian?虽然我们的计算机正在使用Little Endian。还有ARM处理器。

Uint32Array() 这样的类型化数组已经使用Little Endian。我认为这是正确的。

// DataView (Big Endian)
const dataview = new DataView(new ArrayBuffer(4));
dataview.setUint32(0, 42);
console.log(new Uint8Array(dataview.buffer).toString());
// result: 0,0,0,42

// Typed Array (Little Endian)
const typearray = new Uint32Array([42]);
console.log(new Uint8Array(typearray.buffer).toString());
// result: 42,0,0,0

我希望数字类型使用小端序。这是不一致的。 我知道 litleEndian 的 DataView 方法的可选参数。 但我的问题是:为什么默认不设置这个?

【问题讨论】:

    标签: javascript endianness


    【解决方案1】:

    这是 ECMAscript 标准定义的 setUint32 方法的原型:

    24.2.4.20 DataView.prototype.setUint32 ( byteOffset, value [ , littleEndian ] )(https://www.ecma-international.org/ecma-262/6.0/#sec-dataview-constructor)。

    值是存储为小端还是大端由可选的第三个参数定义,其默认值由标准定义为false(存储为大端)。

    Big endian 是所有 TCP/IP 网络协议的默认字节顺序,它并不罕见。

    【讨论】:

    • 为什么是小端的类型化数组?如果该系统面向 TCP/IP(大端)等 Web 协议?
    • 在哪些情况下直接处理 TCP/IP 传输的字节?通常你在更高的层次上进行交流。您将收到的数据与 TCP/IP 的字节序无关。我无法理解。
    • 我已经知道可选属性littleEndian。我只是不明白/不明白为什么大端是默认的。以及为什么默认情况下 TypedArrays 是小端。我正在研究以小端序存储数字的嵌入式系统(ARM)。通信(CAN)也是小端的。最后 TypedArrays 是小端的。我只是想知道为什么 DataView 如此不同。
    • TypedArrays 默认不是小端。他们实际上使用底层操作系统的字节顺序。如今,使用大端芯片制作的系统已经不多了,更不用说运行 javascript 的系统了。所以这就是为什么它可能看起来像 TypedArrays 默认使用小端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2022-06-10
    • 1970-01-01
    • 2016-07-15
    • 2020-12-01
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多