initial code commit

master
Chris Dickinson 11 years ago
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…
Cancel
Save