使用Javascript按位向左移位的字节顺序问题

时间:2014-04-10 00:46:02

标签: javascript go bitwise-operators endianness

我正在尝试将这个简单的函数从Go转换为Javascript:

func ShiftLeft(b []byte) []byte {
    l := len(b)
    if l == 0 {
        panic("shiftLeft requires a non-empty buffer.")
    }

    output := make([]byte, l)

    overflow := byte(0)
    for i := int(l - 1); i >= 0; i-- {
        output[i] = b[i] << 1
        output[i] |= overflow
        overflow = (b[i] & 0x80) >> 7
    }

    return output
}

我的第一次尝试是:

function makeEmpty(size) {


  var result = [];

  for (var i = 0; i < size; i++) {
    result.push(0x00);
  }

  return result;

}

function shiftLeft (b) {

  var len = b.length;

  if (len == 0) {
    throw 'shiftLeft requires a non-empty buffer';
  }

  var output = makeEmpty(len);

  var overflow = 0;

  for (var i = len - 1; i >= 0; i--) {
    output[i] = b[i] << 1;
    output[i] |= overflow;
    overflow = (b[i] & 0x80) >> 7;
  }

  return output;

}

然而,这不起作用。鉴于以下测试用例:

function fromOctal(str) {

  var bytes = [parseInt(str, 2)];

  return bytes;

}

console.log(shiftLeft(fromOctal("10000000"))

Javascript版本返回[256],但预期结果为&#34; 00000000&#34;或[0]

我在这里弄错了什么?我认为它可能与字节序有关,但我不知道如何始终如一地处理这类问题。

1 个答案:

答案 0 :(得分:2)

你的错误似乎是假设数组的元素是8位整数,但是the result of bitwise operators in JavaScript are 32-bit integers,所以当你进行左移时,最重要的位仍然存在。

我相信通过更改:

添加位掩码
output[i] = b[i] << 1;

到:

output[i] = (b[i] << 1) & 0xFF;

应该解决您的问题。

http://jsfiddle.net/MTj63/

作为旁注,我认为您的fromOctal()函数实际上应该命名为fromBinary()