需求:最近项目中xdr文件(交易文件等)decode和encode是用的是java语言,djrpc-djrpc_hack.jar第三方工具。想试试前端技术来读二进制文件,转化为对象。
代码:
const fs = require('fs');
//对象的结构需要预定义,变量名:[长度,值]
var obj = {
a: [4, 0],
b: [4, 0],
c: [2, 0]
}
//异步
// fs.readFile('01_01010501_20170717101101_000001.01', (err, data) => {
// if (err) throw err;
// console.log(data);
// for (var o in obj) {
//
// obj[o][1] = data.readInt32BE(obj[o][0]);
//
// console.log('O:' + o + ' V:' + obj[o][1]);
// }
// });
//同步
var bf = fs.readFileSync('01_01010501_20170717101101_000001.01');
console.log(bf);
var pos = 0;
for (var o in obj) {
obj[o][1] = readXbytes(obj[o][0]);
console.log('O:' + o + ' V:' + obj[o][1]);
// pos+=obj[o][0];
}
function readXbytes(len) {
var value = 0;
switch (len) {
case 1 :
value = bf.readUInt8(pos);
break;
case 2 :
value = bf.readUInt16BE(pos);
break;
case 4 :
value = bf.readUInt32BE(pos);
break;
default :
break;
}
pos += len;
return value;
}
结果:
<Buffer 00 00 00 01 01 01 05 01 20 ff 4a 42 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 20 ff 49 b5 00 00 19 07 01 01 05 01 00 00 00 00 00 00 ... >
O:a V:1
O:b V:16844033
O:c V:8447
总结:
1.js语言是若数据类型,对象的成员变量数据类型长度需要定义,不像java可以通过反射获取。遍历对象倒是很简单
2.node最多能读到UInt32,也就是无符号4字节,想读更多的内容需要自己去组装了。readDouble和readFloat分别是64和32位,但业务上不需要使用,用处不大
3.有哪些不足之处,欢迎指出
写文件,待续。。。