端序(字节序)

358 阅读2分钟

端序(字节序)

通常,我们会把内存抽象成带有地址信息的字节序列。

如果想要在某个地址存储1个字节的数据,例如,把0x12存储到地址为0x000000010的字节中,这个没有异议:

地址...0x0f0x100x11
内容...xxx0x12xxx

但是,如果要在这个地址存2个字节的数据0x1234,就会有下面两种方式:

小端序

按地址降序排列字节:这种排列方式被称为小端序(little-endian)

地址...0x0f0x100x11
内容...xxx0x340x12

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 = 520x12 => 1 * 16 + 2 = 18

大端序

按地址升序排列字节:这种排列方式被称为大端序(big-endian)

地址...0x0f0x100x11
内容...xxx0x120x34

和上面一样,通过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],则为小端序。