关于前端:DataView-中-字节序

43次阅读

共计 1354 个字符,预计需要花费 4 分钟才能阅读完成。

DataView 视图是一个能够从 二进制 ArrayBuffer 对象中读写多种数值类型的底层接口,应用它时,不必思考不同平台的 字节序 问题。
DataView 上面的很多办法能够操作字节序的形式,以 getInt16 为例

dataview.getInt16(byteOffset [, littleEndian])

参数
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…

正文完
 0