json数据格式在网络中传输需要的数据比二进制庞大太多,我们可以省去key,外加将数字不需要编码成字符串,直接二进制编码就OK。
pack : 将json压包,unpack解包成json。
var Struct = module.exports = {};
Struct.TYPE = {
int8:1,
int16:2,
int32:3,
uint8:4,
uint16:5,
uint32:7,
string:8,
object:9,
aint8:10,
aint16:11,
aint32:12,
auint8:13,
auint16:14,
auint32:15,
aobject:16
};
//
Struct.unpack = function(proto, buf) {
var _unpack = function(proto, buf, pos) {
var p = {};
var ret;
var length;
for (var k in proto) {
var type = proto[k][0];
if (typeof type == 'object') {
var json = type;
type = 'object';
}
if (proto[k].length == 2 && proto[k][1] == 'array') {
type = 'a' + type;
}
var value = [];
switch(Struct.TYPE[type]) {
case Struct.TYPE.int8:
p[k] = buf.readInt8(pos);
pos += 1;
break;
case Struct.TYPE.int16:
p[k] = buf.readInt16BE(pos);
pos += 2;
break;
case Struct.TYPE.int32:
p[k] = buf.readInt32BE(pos);
pos += 4;
break;
case Struct.TYPE.uint8:
p[k] = buf.readUInt8(pos);
pos += 1;
break;
case Struct.TYPE.uint16:
p[k] = buf.readUInt16BE(pos);
pos += 2;
break;
case Struct.TYPE.uint32:
p[k] = buf.readUInt32BE(pos);
pos += 4;
break;
case Struct.TYPE.string:
ret = getLen(buf,pos);
pos = ret[1];
p[k] = buf.toString('utf-8',pos, pos + ret[0]);
pos += ret[0];
break;
case Struct.TYPE.object:
ret = _unpack(json, buf, pos);
p[k] = ret[0];
pos = ret[1];
break;
case Struct.TYPE.aint8:
ret = getLen(buf,pos);
length = ret[0];
pos = ret[1];
for (var i=0; i < length; i++) {
value.push(buf.readInt8(pos));
pos += 1;
}
p[k] = value;
break;
case Struct.TYPE.aint16:
ret = getLen(buf,pos);
length = ret[0];
pos = ret[1];
for (var i=0; i < length; i++) {
value.push(buf.readInt16BE(pos));
pos += 2;
}
p[k] = value;
break;
case Struct.TYPE.aint32:
ret = getLen(buf,pos);
length = ret[0];
pos = ret[1];
for (var i=0; i < length; i++) {
value.push(buf.readInt32BE(pos));
pos +