Javascript按位左移时的Endianness问题

Javascript按位左移时的Endianness问题,javascript,go,bitwise-operators,endianness,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;

我正在尝试将这个简单的函数从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
}
Javascript版本返回
[256]
,但预期结果为“00000000”或
[0]


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

您的错误似乎在于假设数组的元素是8位整数,但当您执行左移位时,最重要的位仍然存在

我认为,通过改变,增加一点遮罩:

output[i] = b[i] << 1;

output[i]=b[i]谢谢!有没有更“一致”的方法来处理这些问题?有可能全面使用TypeDarray吗?我对原始二进制数据没有做太多的工作,尤其是在JavaScript中,所以我可能不是最好的提问者,但我肯定会建议研究
ArrayBuffer
s和
Uint8Array
s必须提供什么,因为它们是专为你似乎正在做的事情而设计的。我怀疑使用
Uint8Array
是否会有帮助——IIRC在使用逐位运算符时,它会转换回32位整数(JavaScript实际上没有单独的数字类型,它只是意味着它在内部存储为该类型)。@OneKitten我认为你的说法不正确。类型化数组的全部目的是提供类型化值的数组,本文指出“类型化数组是一块内存板,其中包含类型化视图”。它们无法更改逐位运算符的行为,但当为数组指定值时,将使用正确的位数。试试看:
vara=newuint8array(2);a[0]=0x88;a[0]=a[0]@JLRishe:我明白你的意思了(将在5分钟内删除这两条评论)。
function fromOctal(str) {

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

  return bytes;

}

console.log(shiftLeft(fromOctal("10000000"))
output[i] = b[i] << 1;
output[i] = (b[i] << 1) & 0xFF;