4

JavaScript 代码是否

var n = 8; // or some arbitrary integer literal
n >> 1;

总是表示“没有余数的整数除法 2”?如果整数文字大于一个字节,我担心的是字节序。

我的问题的背景如下:

如果我有一种不同于 JS 的类型化编程语言,我有一个范围从 0 到 2^32-1 的整数变量,它将适合 uint32。我需要将其转换为具有四个元素的 Uint4Array 以小端顺序排列。

我目前的 JavaScript 方法是:

function uInt32ToLEByteArray( n ) {
  var byteArray = new Uint8Array(4);
    for( var i = 0; i < 4; i++ ) {
      byteArray[i] = n & 255;
      n >> 8;
    }
  return byteArray;
}

这段代码在我的浏览器中有效,但我想知道这是否会在任何地方都有效。主要思想是通过取 LSB 并除以 256 来填充数组。但是真正的除法“/”会将变量转换为浮点变量。所以我使用“>>8”,但这实际上假设了大字节序。

4

1 回答 1

2

您给出的代码与字节序完全无关。

但是,如果您要重新解释 uint32 数组中的字节数组,那么结果会因浏览器运行的机器的字节序而有所不同。

首先,修复代码中的错误:

function uInt32ToLEByteArray(n) {
    var byteArray = new Uint8Array(4);
    for (var i = 0; i < 4; i++) {
        byteArray[i] = n & 255;
        n >>>= 8; //simply doing n >> 8 has no effect actually
    }
    return byteArray;
}

然后

var a = uInt32ToLEByteArray(0xFF)
console.log(a);
//always [255, 0, 0, 0]

var b = new Uint32Array(a.buffer);
console.log(b);
//[255] on little endian machines
//[4278190080] on big endian machines
于 2013-08-16T20:12:19.980 回答