I am trying to translate this simple function from Go to 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
}
My first attempt was this:
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;
}
However, this does not work. Given the following test case:
function fromOctal(str) {
var bytes = [parseInt(str, 2)];
return bytes;
}
console.log(shiftLeft(fromOctal("10000000"))
The Javascript version returns [256]
, but the expected result is "00000000" or [0]
.
What am I getting wrong here? I think it might have to do with endianness, but I have no idea about how to deal with this kind of issue consistently.