initial code commit
parent
01ae0560bc
commit
7cd6c24150
@ -0,0 +1,52 @@
|
|||||||
|
module.exports = varint
|
||||||
|
|
||||||
|
varint.encode = encode
|
||||||
|
|
||||||
|
var EE = require('events').EventEmitter
|
||||||
|
, MSB = 0x80
|
||||||
|
, REST = 0x7F
|
||||||
|
, MSBALL = ~REST
|
||||||
|
|
||||||
|
function varint() {
|
||||||
|
var ee = new EE
|
||||||
|
|
||||||
|
ee.write = write
|
||||||
|
ee.accum = []
|
||||||
|
|
||||||
|
return ee
|
||||||
|
}
|
||||||
|
|
||||||
|
function encode(num, out, offset) {
|
||||||
|
out = out || []
|
||||||
|
offset = offset || 0
|
||||||
|
|
||||||
|
while(num & MSBALL) {
|
||||||
|
out[offset++] = (num & 0xFF) | MSB
|
||||||
|
num >>>= 7
|
||||||
|
}
|
||||||
|
out[offset] = num
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
function write(byte) {
|
||||||
|
var msb = byte & MSB
|
||||||
|
, accum = this.accum
|
||||||
|
, len
|
||||||
|
, out
|
||||||
|
|
||||||
|
accum[accum.length] = byte & REST
|
||||||
|
if(msb) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
len = accum.length
|
||||||
|
out = 0
|
||||||
|
|
||||||
|
for(var i = 0; i < len; ++i) {
|
||||||
|
out |= accum[i] << (7 * i)
|
||||||
|
}
|
||||||
|
|
||||||
|
accum.length = 0
|
||||||
|
this.emit('data', out)
|
||||||
|
return
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "varint",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "use msb to create integer values of varying sizes",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "node test.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/chrisdickinson/varint.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"varint",
|
||||||
|
"protobuf",
|
||||||
|
"encode",
|
||||||
|
"decode"
|
||||||
|
],
|
||||||
|
"author": "Chris Dickinson <chris@neversaw.us>",
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"tape": "~0.2.2"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
var varint = require('./index')
|
||||||
|
, test = require('tape')
|
||||||
|
|
||||||
|
test('fuzz test', function(assert) {
|
||||||
|
var vi = varint()
|
||||||
|
, expect
|
||||||
|
, encoded
|
||||||
|
|
||||||
|
vi.on('data', function(data) {
|
||||||
|
assert.equal(expect, data, 'fuzz test: '+expect.toString(16))
|
||||||
|
})
|
||||||
|
|
||||||
|
for(var i = 0, len = 100; i < len; ++i) {
|
||||||
|
expect = randint(0x7FFFFFFF)
|
||||||
|
encoded = varint.encode(expect)
|
||||||
|
|
||||||
|
for(var x = 0; x < encoded.length; ++x) {
|
||||||
|
vi.write(encoded[x])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test single byte works as expected', function(assert) {
|
||||||
|
var num = [0xAC, 0x02]
|
||||||
|
var acc = varint()
|
||||||
|
|
||||||
|
acc.on('data', function(data) {
|
||||||
|
assert.equal(data, 300, 'should equal 300 every time')
|
||||||
|
})
|
||||||
|
|
||||||
|
for(var i = 0, len = 10; i < len; ++i) {
|
||||||
|
acc.write(0xAC)
|
||||||
|
acc.write(0x02)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test encode works as expected', function(assert) {
|
||||||
|
var out = []
|
||||||
|
|
||||||
|
assert.deepEqual(varint.encode(300), [0xAC, 0x02])
|
||||||
|
|
||||||
|
assert.end()
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
function randint(range) {
|
||||||
|
return ~~(Math.random() * range)
|
||||||
|
}
|
Loading…
Reference in New Issue