bitmessage-js/lib/varint.js

43 lines
1.1 KiB
JavaScript
Raw Normal View History

2014-12-18 17:47:18 +01:00
/**
* Implement `var_int` encoding/decoding.
* @module bitmessage/varint
*/
"use strict";
2014-12-20 11:48:12 +01:00
var assert = require("assert");
2014-12-18 17:47:18 +01:00
// TODO(Kagami): Since `node-int64` and `int64-native` APIs are slightly
// differ, there might be need in platform-dependent wrapper. Also think
// that to do with 64bit arithmetic since `node-int64` doesn't implement
// it.
var Int64 = require("int64-native");
exports.decode = function(buf) {
assert(buf.length > 0, "Empty buffer");
var value, length;
switch (buf[0]) {
case 253:
value = buf.readUInt16BE(1);
2014-12-18 18:16:21 +01:00
assert(value >= 253, "Impractical var_int");
2014-12-18 17:47:18 +01:00
length = 3;
break;
case 254:
value = buf.readUInt32BE(1);
2014-12-18 18:16:21 +01:00
assert(value >= 65536, "Impractical var_int");
2014-12-18 17:47:18 +01:00
length = 5;
break;
case 255:
var hi = buf.readUInt32BE(1);
var lo = buf.readUInt32BE(5);
value = new Int64(hi, lo);
2014-12-18 18:16:21 +01:00
assert(value >= 4294967296, "Impractical var_int");
2014-12-18 17:47:18 +01:00
length = 9;
break;
default:
value = buf[0];
length = 1;
}
var rest = buf.slice(length);
return {value: value, length: length, rest: rest};
};