msb128
Version:
Read and write MSB base 128 encoded variable length integers
45 lines (36 loc) • 735 B
JavaScript
var bn = require('bn.js')
function read (buf) {
var n = new bn(0)
var test = 0, i = 0
while (true) {
n = n.shln(7)
n = n.addn((buf[i] & 0x7f))
if (buf[i++] & 0x80)
n = n.addn(1)
else
return { res: n, off: i }
}
}
function write (n) {
if (!(n instanceof bn)) {
n = new bn(n)
}
var tmp = []
var len = 0
var buf = new Buffer([])
while (true) {
tmp[len] = new bn(n.andln(0x7f))
tmp[len] = tmp[len].addn(len ? 0x80 : 0x00)
if (n.cmpn(0x7f) <= 0)
break
n = n.shrn(7)
n = n.subn(1)
len++
}
do {
buf = Buffer.concat([ buf, new Buffer(tmp[len].toArray()) ])
} while(len--)
return buf
}
module.exports.read = read
module.exports.write = write