字节序理解示例

字节序的介绍文章网上非常多,这里不再赘述,可以参考MDN上的介绍。

在做底层网络编程的时候会遇到字节序转换的情况,因为我们现在接触的机器一般都是little-endian(小端序)而网络传输一般使用big-endian(大端序)

那么,站在前端的角度如何通过示例来验证小端序呢?且看代码:

const buffer = new ArrayBuffer(2) // 申请2字节缓冲区
const u16View = new Uint16Array(buffer) // 使用16位无符号视图,以双字节为单位读写buffer
u16View[0] = 300
const u8View = new Uint8Array(buffer) // 使用8位无符号视图,以单字节读写buffer
console.log(u8View) // 得到[44, 1]

[44, 1]对应的二进制位 [00101100, 00000001]

由于内存是连续的,我们如果按大端序解析这两个字节,得到的结果应该是:

parseInt("0010110000000001", 2) // 11265

并不是我们开始写入的300,而反过来:

parseInt("0000000100101100", 2) // 300

得到了我们想要的结果。