我正在尝试将这个简单的函数从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]
。
我在这里弄错了什么?我认为它可能与字节序有关,但我不知道如何始终如一地处理这类问题。
答案 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;
应该解决您的问题。
作为旁注,我认为您的fromOctal()
函数实际上应该命名为fromBinary()
。