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

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;