DataView 中 字节序
DataView 视图是一个可以从 二进制ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序问题。
DataView 下面的很多方法可以操作字节序的方式,以 getInt16 为例
dataview.getInt16(byteOffset [, littleEndian])
【DataView 中 字节序】参数
byteOffset
偏移量, 单位为字节, 从头开始计算.
littleEndian
可选 表示该 16 位整数是否以 little- or big-endian 格式存储的(就是使用的字节序格式,具体参考链接页面);如果传入的值为 true,就表示使用 little-endian(低字节序),如果传入的值为 false 或者 undefined,则会使用 big-endian(高字节序) 方式读值。
字节序
当数据太大,一个字节存不下的时候,我们就得使用多个字节了。比如,我有个需要4个字节存储的整数,为了方便说明,使用16进制表示这个数,例如0x12345678。有的人采用以下方式存储这个个数字:
文章图片
这个方案看起来不错,但是,又有人采用了以下方式:
文章图片
两种方案虽有不同,但也有共识,即依次存储每一个数字,即0x12345678。大家的分歧在于,对于某一个要表示的值,因为只能一个字节一个字节的存,我是把值的低位存到低地址,还是把值的高位存到低地址。前者使用的是“小端(Little endian)”字节序,即先存低位的那一端(数字的最低位是0x78),如上图中的第一个图;后者使用的是“大端(Big endian)”字节序,即先存高位的那一端(数字的最高位分是0x12),如上图中的第二个图。
由此也引发了计算机界的大端与小端之争,不同的CPU厂商并没有达成一致:
x86,MOS Technology 6502,Z80,VAX,PDP-11等处理器为Little endian。
Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器为Big endian。
ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字节序是可配置的。
示例代码(node)
const { Buffer } = require('buffer')const buf = Buffer.from([0x12, 0x34, 0x56, 0x78])function toArrayBuffer(buf) {
var ab = new ArrayBuffer(buf.length);
var view = new Uint8Array(ab);
for (var i = 0;
i < buf.length;
++i) {
view[i] = buf[i];
}
return ab;
}const arrayb = toArrayBuffer(buf)const view = new DataView(arrayb)console.log(view.getInt16(0)) // 4660 -> 0x1234
console.log(view.getInt16(0, true)) // 13330 -> 0x3412
参考:
https://zhuanlan.zhihu.com/p/...
https://developer.mozilla.org...
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理