【问题标题】:What is the best practice to make JavaScript's Typed Arrays "Endian Safe"?使 JavaScript 的类型化数组“字节序安全”的最佳实践是什么?
【发布时间】:2012-10-30 19:31:43
【问题描述】:

JavaScript 类型数组在字节序方面存在危险。

假设你有这样一个函数:

var encodeFloat32 = (function() {
  var arr  = new Float32Array( 1 );
  var char = new Uint8Array( arr.buffer );
  return function( number ) {
    arr[0] = number;
    return String.fromCharCode( char[0], char[1], char[2], char[3] );
  };
}());

如果您要在 Big Endian 系统上运行它,这是一个潜在的危险函数,因为您将 ArrayBuffers 字节提交给“fromCharCode”方法的顺序。

因此,您需要创建某种字节序安全性以使您的代码独立于平台。

在用 JavaScript 编写的应用程序中创建“字节序安全”的最佳做法是什么?有什么解决方法吗?

【问题讨论】:

    标签: javascript cross-platform endianness typed-arrays


    【解决方案1】:

    根据这篇文章,字节序在 JavaScript 中是安全的

    JavaScript Endian Encoding?

    查看DataView 对象(仍在草稿中),它对您的要求很有用,因为它提供了littleEndian boolean

    【讨论】:

    • 我相信这篇文章是在 Typed Arrays 出现在 JavaScript 之前发布的。它解释了位移是字节序安全的,但我认为它不适用于类型化数组。
    • DataView 看起来很有希望,但我不确定您将如何实际使用它来实现字节序安全。
    • 我的假设是,如果您总是通过 DataView 读取/写入值,您可以“忽略”平台的字节序。 (同样这是一个假设,我没有什么可以证明的)这篇文章可能会有所帮助stackoverflow.com/a/7876265/149636
    • DataView gives you a boolean littleEndian to set。这绝对是要走的路,因为它旨在解决这个“问题”。
    • @LightnessRacesinOrbit 感谢您的链接,我将其添加到答案中
    【解决方案2】:

    我在 javascript 中使用这样的函数首先检查(我设置了字符串以实现效果,我通常只使用 bool 或类似的):

    function checkEndian(){
        var a = new ArrayBuffer(4);
        var b = new Uint8Array(a);
        var c = new Uint32Array(a);
        b[0] = 0xa1;
        b[1] = 0xb2;
        b[2] = 0xc3;
        b[3] = 0xd4;
        if(c[0] == 0xd4c3b2a1) return "little endian";
        if(c[0] == 0xa1b2c3d4) return "big endian";
        else throw new Error("Something crazy just happened"); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2013-06-19
      • 1970-01-01
      • 2010-09-12
      相关资源
      最近更新 更多