JavaScript 在 ES6 引入那些集合类型—TypeArray(3) 大端存储和小端存储

359 阅读2分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

在开始今天内容,先普及一下。大端存储和小端存储是计算存储模式

在实际的编程开发中,为了确定当前计算机使用的存储模式是大端存储还是小端存储,计算机系统中的内存是以字节为单位划分的,每个地址单元都对应着一个字节,一个字节,大小为八比特,可以存放一个八位的二进制数,比如 10101010

例如在 C 语言中,除了 8 比特的 char 类型之外,还有 16 比特的 short 类型,32比特的 lang类型,这主要取决于具体的编译器,且对于位数大于八位的处理器,例如 16 位的 CPU 或者 32 位的 CPU,由于寄存器大小要大于一个字节,那么就存在着如何将多个字节放置进内存的问题。

因此,就出现了大端存储模式小端存储模式, 大端存储模式是指数据的低位,字节序保存在内存的高地址中,而数据的高位,字节序保存在内存的低地址,小端存储模式则恰恰相反,

将16进制的数值 0xABCD 写入到以 0000 开始的内存中,大端模式将会从右向左依次读取较低位的字节存入地址较大的内存单元中,先是 0xAB,然后是 0xCD。

而小端模式将会从右向左依次读取较低位的字节,存入地址较小的内存单元中,先是 0xCD,然后是 0xAB。

大端模式 CPU

  • QC51 小端模式 CPU
  • X86
  • ARM
  • DSP

采取哪种大小端模式往往由 CPU 架构决定的,所以在于本地 API 进行数据通信是,采用哪种模式需要 和本地 API 中保持一致。

另一方面,在不同的平台上,协议和二进制文件的存储模式也是不同的,因此,所以访问数据也需要注意平台采用哪种模式来保存数据,避免发生问题。

可以使用下面的代码来检查平台的大小端设置。

const BIG_ENDIAN = Symbol('BIG_ENDIAN');
const LITTLE_ENDIAN = Symbol('LITTLE_ENDIAN');
function getPlatformEndianness() {
    const arr32 = Uint32Array.of(0x12345678);
    const arr8 = new Uint8Array(arr32.buffer);
    switch ((arr8[0]*0x1000000) + (arr8[1]*0x10000) + (arr8[2]*0x100) + (arr8\
[3])) {
        case 0x12345678:
            return BIG_ENDIAN;
        case 0x78563412:
            return LITTLE_ENDIAN;
        default:
            throw new Error('Unknown endianness');
    }
}

也有一些平台以不同的编码方式安排字(字节对),而不是大小端模式存储的字节。这就是所谓的混合编码。如果想支持这样的平台,那么很容易就可以扩展以前的代码。