Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

强类型数组的字节顺序

  一般使用变量时只会在意变量的类型和值,不会在意变量在内存里的存储方式。普通的变量确实没必要在意存储方式,但是强类型数组有时就需要,因为它们在内存中是连续储存的,将其作为指针传递给其它接口时,字节顺序之类的东西是视接口而定的。
  默认情况下,他们都是little-endian的,可以做下面的测试 new Uint8Array(new ArrayBuffer([258]));
  258这个十进制数字在256进制上就表示为12,但是我们的结果中2在前面,1在后面。也就是说低位在前,高位在后,所以说默认是little-endian的。
  为此,浏览器还提供了支持指定字节顺序的操作接口DataView。它从一个ArrayBuffer上创建,并提供了对ArrayBuffer的一系列按类型读写数据的方法: getInt8/setInt8
getUint8/setUint8
getInt16/setInt16
getUInt16/setUInt16
getInt32/setInt32
getUInt32/setUInt32
getFloat32/setFloat32
getFloat64/setFloat64
  这些方法默认以big-endian方式操作数据的: <script>
var buf=new ArrayBuffer(2); //创建一个两字节的连续空间
new DataView(buf).setUint16(0,258); //写入一个Uint16数据258
console.log(new Uint8Array(buf)); //输出每个字节
</script>

  这和之前的结果就不同,高位在前面,所以是big-endian的。但这些方法还有下一个参数,它默认是false,所以是big-endian,把它设置成true就是little-endian了。 <script>
var buf=new ArrayBuffer(2); //创建一个两字节的连续空间
var dtv=new DataView(buf); //创建数据视图
dtv.setUint16(0,258,true); //写入一个Uint16数据258
console.log(dtv.getUint16(0,true)); //结果正确
console.log(dtv.getUint16(0)); //结果错误
console.log(new Uint16Array(buf)); //结果正确
</script>
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^