端序(字节序)
通常,我们会把内存抽象成带有地址信息的字节序列。
如果想要在某个地址存储1个字节的数据,例如,把0x12存储到地址为0x000000010的字节中,这个没有异议:
| 地址 | ... | 0x0f | 0x10 | 0x11 |
|---|---|---|---|---|
| 内容 | ... | xxx | 0x12 | xxx |
但是,如果要在这个地址存2个字节的数据0x1234,就会有下面两种方式:
小端序
按地址降序排列字节:这种排列方式被称为小端序(little-endian)
| 地址 | ... | 0x0f | 0x10 | 0x11 |
|---|---|---|---|---|
| 内容 | ... | xxx | 0x34 | 0x12 |
javascirpt中的DataView可以用来指定端序写入数据,可以通过简单的代码具体看一下:
const buffer = new ArrayBuffer(2)
const dataView = new DataView(buffer)
// 第三个参数表示是否使用小端序 传入true 表示使用小端序
dataView.setInt16(0, 0x1234, true)
console.log(buffer)
// buffer中的内容
// 0: 52
// 1: 18
输出结果会被转换成10进制,0x34 => 3 * 16 + 4 = 52,0x12 => 1 * 16 + 2 = 18
大端序
按地址升序排列字节:这种排列方式被称为大端序(big-endian)
| 地址 | ... | 0x0f | 0x10 | 0x11 |
|---|---|---|---|---|
| 内容 | ... | xxx | 0x12 | 0x34 |
和上面一样,通过DataView具体看一下:
const buffer = new ArrayBuffer(2)
const dataView = new DataView(buffer)
// 第三个参数表示是否使用小端序 这里传入false 表示使用大端序
dataView.setInt16(0, 0x1234, false)
console.log(buffer)
// buffer中的内容
// 0: 18
// 1: 52
判断端序
思路和上面说的一样,我们给顺序表中写一个2字节的数据,然后分别读取这两个字节,就可以知道字节顺序了。
Javascript
const buffer = new ArrayBuffer(10)
const uint8 = new Uint8Array(buffer)
const uint16 = new Uint16Array(buffer)
uint16[0] = 0x0102
console.log(uint8[0])
console.log(uint8[1])
如果结果是[1, 2],则为大端序;如果结果是[2, 1],则为小端序。