当前位置: 首页 > Web前端 > HTML

DataView中的字节顺序

时间:2023-03-28 12:58:02 HTML

DataView视图是一个低级接口,可以从二进制ArrayBuffer对象读取和写入多种数字类型。使用时无需考虑不同平台的字节顺序。DataView下的很多方法都可以操作字节顺序。以getInt16为例dataview.getInt16(byteOffset[,littleEndian])参数byteOffset偏移量,单位为byte,从头开始计算。littleEndian是可选的,表示16位整数是否以little-endian格式或big-endian格式存储(即使用的字节序格式,详见链接页面);如果传入的值为true,则表示使用little-endian(低字节序),如果传入的值为false或undefined,则将以big-endian(高字节序)读取该值。Endianness当数据太大,一个字节装不下时,我们不得不使用多个字节。比如我有一个整数需要用4个字节来存储。为了解释方便,用十六进制来表示这个数,比如0x12345678。有些人是这样存储这个数的:这个方案看起来不错,但也有人采用了下面的方式:两种方案虽然不同,但有个共识是每个数依次存储,即0x12345678。大家的分歧在于,对于某个要表示的值,因为它只能逐字节存储,我应该把值的低位存储在低地址,还是把值的高位存储在低地址。前者采用“littleendian”字节序,即先存放低位的一端(数的最低位为0x78),如上图第一张图;后者采用“大端(Bigendian)”字节序,即先存放高位的那一端(数的最高位为0x12),如上图第二张图所示。这也引发了计算机界的big-endian和little-endian之争。不同的CPU厂商还没有达成一致:x86、MOSTechnology6502、Z80、VAX、PDP-11等处理器都是littleendian。Motorola6800、Motorola68000、PowerPC970、System/370、SPARC(V9除外)等处理器都是Bigendian。ARM、PowerPC(PowerPC970除外)、DECAlpha、SPARCV9、MIPS、PA-RISC和IA64的字节顺序是可配置的。示例代码(节点)const{Buffer}=require('buffer')constbuf=Buffer.from([0x12,0x34,0x56,0x78])functiontoArrayBuffer(buf){varab=newArrayBuffer(buf.length);varview=newUint8Array(ab);for(vari=0;i0x1234console.log(view.getInt16(0,true))//13330->0x3412参考:https://zhuanlan.zhihu.com/p/…https://developer.mozilla.org…