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