protobuf.js
Version:
a pure javascript protocol buffer encoding implementation, written specifically for riak
88 lines (65 loc) • 2.17 kB
JavaScript
var long = require('long');
exports.dezigzag = function (value) {
return (value >>> 1) ^ -(value & 1);
};
exports.read = function (buffer, offset, signed) {
var byte, temp;
var result = 0;
var position = offset || 0;
var shift = 0;
do {
byte = buffer[position];
result += (byte & 0x7F) << shift;
shift += 7;
position++;
} while (byte >= 0x80);
if (!signed) result = result >>> 0;
return { length: (position - offset), value: result };
};
exports.dezigzag64 = function (value) {
return value.shiftRightUnsigned(1).xor(value.and(long.fromNumber(1)).negate());
};
exports.read64 = function (buffer, offset, signed) {
var byte;
var result = long.fromNumber(0);
var position = offset || 0;
var shift = 0;
do {
byte = buffer[position];
result = result.add(long.fromNumber(byte & 0x7F).shiftLeft(shift));
shift += 7;
position++;
} while (byte >= 0x80);
if (!signed) result = result.toUnsigned();
return { length: (position - offset), value: result };
};
exports.zigzag = function (value) {
return (value << 1) ^ (value >> 31);
};
exports.write = function (buffer, number, offset) {
offset = offset || 0;
var position = offset || 0;
number = number >>> 0;
while ((number & ~0x7F) >>> 0) {
if (buffer) buffer[position] = ((number & 0xFF) >>> 0) | 0x80;
number = number >>> 7;
position++;
}
if (buffer) buffer[position] = number;
return position - offset + 1;
};
exports.zigzag64 = function (value) {
return value.shiftLeft(1).xor(value.shiftRight(63));
};
exports.write64 = function (buffer, number, offset) {
offset = offset || 0;
var position = offset || 0;
number = number.toUnsigned();
while (number.and(long.fromNumber(~0x7F)).greaterThan(long.fromNumber(0))) {
if (buffer) buffer[position] = number.and(long.fromNumber(0xFF)).or(long.fromNumber(0x80)).toNumber();
number = number.shiftRightUnsigned(7);
position++;
}
if (buffer) buffer[position] = number.toNumber();
return position - offset + 1;
};