Javascript 类型化数组和字节顺序

标签 javascript endianness webgl typed-arrays arraybuffer

我正在使用 WebGL 渲染二进制编码的网格文件。二进制文件以大端格式写出(我可以通过在十六进制编辑器中打开文件或使用 fiddler 查看网络流量来验证这一点)。当我尝试使用 Float32Array 或 Int32Array 读取二进制响应时,二进制被解释为小端字节序并且我的值是错误的:

// Interpret first 32bits in buffer as an int
var wrongValue = new Int32Array(binaryArrayBuffer)[0];

我在 http://www.khronos.org/registry/typedarray/specs/latest/ 中找不到任何对类型化数组默认字节顺序的引用所以我想知道这是怎么回事?在使用类型化数组读取时,我是否应该假设所有二进制数据都应该是小端字节序的?

为了解决这个问题,我可以使用 DataView 对象(在前面的链接中讨论过)并调用:

// Interpret first 32bits in buffer as an int
var correctValue = new DataView(binaryArrayBuffer).getInt32(0);

“getInt32”等 DataView 函数默认读取大端值。

(注意:我已经使用 Google Chrome 15 和 Firefox 8 进行了测试,它们的行为方式相同)

最佳答案

当前行为由底层硬件的字节顺序决定。由于几乎所有台式计算机都是 x86,这意味着小端。大多数 ARM 操作系统使用小端模式(ARM 处理器是双端模式,因此可以在任何一种模式下运行)。

这有点令人难过的原因是,这意味着几乎没有人会测试他们的代码是否在大端硬件上工作,而这会损害所做的工作,而且整个 Web 平台都是围绕跨实现统一工作的代码设计的和平台,这打破了。

关于Javascript 类型化数组和字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7869752/

相关文章:

c - 64 位值的字节序表示

c++ - 如何以字节序不可知的方式读取 UTF-16 代码点的长度

javascript - 如何向 WebGL 着色器绘制的圆形/椭圆形添加统一宽度的轮廓(使用边缘/距离抗锯齿绘制)

javascript - 如何有效地从 webgl 属性缓冲区的中间删除三 Angular 形

javascript - 如何在 HTML 中导入和操作 3D 对象

javascript - Meteor.js 部署用于 Web 和移动 native 应用程序,一个代码库

javascript - 如何知道 webkitSpeechRecognition 是否启动?

javascript - 如何知道您使用的 Angular Classy 版本是什么?

javascript - 创建对象和对象数组

c++ - 如何将 UUID 转换为大端?