You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.2 KiB
85 lines
2.2 KiB
var Long = require('long'); |
|
|
|
|
|
var BufferMaker = function(){ |
|
this.plan = []; |
|
}; |
|
|
|
var types = {"UInt8" : { bytes : 1}, |
|
"Int8" : { bytes : 1}, |
|
"Int16BE" : { bytes : 2}, |
|
"Int32BE" : { bytes : 4}, |
|
"Int16LE" : { bytes : 2}, |
|
"Int32LE" : { bytes : 4}, |
|
"UInt16BE" : { bytes : 2}, |
|
"UInt32BE" : { bytes : 4}, |
|
"FloatLE" : { bytes : 4}, |
|
"DoubleLE" : { bytes: 8}, |
|
"FloatBE" : { bytes : 4}, |
|
"DoubleBE" : { bytes : 8}, |
|
"UInt16LE" : { bytes : 2}, |
|
"UInt32LE" : { bytes : 4}, |
|
"Int64BE" : { bytes : 8}, |
|
"string" : {} |
|
}; |
|
|
|
// create methods for each type |
|
function addTypeMethod(type){ |
|
BufferMaker.prototype[type] = function(val){ |
|
this.plan.push({ type : type, value : val}); |
|
return this; |
|
}; |
|
} |
|
|
|
for(var type in types){ |
|
addTypeMethod(type); |
|
} |
|
|
|
|
|
BufferMaker.prototype.make = function(){ |
|
var bytecount = 0; |
|
var offset = 0; |
|
var item; |
|
var i, j = 0; |
|
for(i = 0; i < this.plan.length; i++){ |
|
item = this.plan[i]; |
|
if (item.type === 'string'){ |
|
if (Buffer.isBuffer(item.value)){ |
|
bytecount += item.value.length; |
|
} else { |
|
bytecount += Buffer.byteLength(item.value); |
|
} |
|
} else { |
|
bytecount += types[item.type].bytes; |
|
} |
|
} |
|
var buffer = new Buffer(bytecount); |
|
for(i = 0; i < this.plan.length; i++){ |
|
item = this.plan[i]; |
|
switch(item.type){ |
|
case "Int64BE": |
|
var longVal = Long.fromString(item.value + ""); |
|
buffer.writeInt32BE(longVal.getHighBits(), offset); //write the high order bits (shifted over) |
|
buffer.writeInt32BE(longVal.getLowBits(), offset + 4); //write the low order bits |
|
offset += 8; |
|
break; |
|
case "string": |
|
if (typeof item.value === 'string'){ |
|
buffer.write(item.value, offset); |
|
offset += Buffer.byteLength(item.value); |
|
} else { |
|
item.value.copy(buffer, offset, 0); |
|
offset += item.value.length; |
|
} |
|
|
|
break; |
|
default : |
|
buffer['write' + item.type](item.value, offset); |
|
offset += types[item.type].bytes; |
|
} |
|
} |
|
return buffer; |
|
|
|
}; |
|
|
|
module.exports = BufferMaker;
|
|
|