由于最近项目需要,不得不读取 .bson 文件,网上都是读取 json 的,关于 bson 的几乎没有!!折腾了两天,最终整理出个路子,如下:
首先是通过 JavaScript 读取的,为啥要用这个语言,不知道不清楚不了解!!!好吧,实际上是 libbson(C++)没搞出来,一没文档,二没帖子,看源码也没看出个所以然;Python 就更别说了(┭┮﹏┭┮被逼地简直头皮发麻***)
要说明的是,我是需要读取 .bson 文件中的特定内容,也就是指定元素的值。 libbson 提供了掰着手指头都能数得过来的几个例子,有一个是可以读取bson文件然后输出到命令行的,是一股脑地输出,不想要的也输出,而且没有层次,长下面这鬼样纸:
所以最终还是用 JS 实现的。
JS无需编译,直接运行 .js 文件即可。这里是通过 Node.js (一个方便使用 JavaScript 的环境)实现的,使用方法如下:
node bson_gao.js gao.bson 789.txt
node 就是用 Node.js 启动,bson_gao.js 是我编写的读取 bson 文件的脚本,gao.bson 是要读取的文件,123.txt 是最终要存储数据的文件。
运行这个指令后会出现一堆莫名其妙的文件,本人不是专业搞 JS 的,所以也不清楚运作机理,不过这些都不重要。重要的是,程序会读取 gao.bson 文件,然后把需要读取的数据存入 123.txt。
运行代码前,当然要先装上 Node.js,并且在里面下载好 fs 和 bson 模块,这个网上搜一下有很多资料的。
bson_gao.js 代码如下:
1 const fs = require("fs"); 2 const bson = require(\'bson\'); 3 4 var fileName = process.argv.splice(2); //读取命令行输入参数,从第3个开始 5 console.log("读取内容为 : "); 6 fs.readFile(fileName[0].toString(), 7 function(err,data){ 8 if(err){ 9 console.error(err); 10 } 11 else{ 12 var mappoints = bson.deserialize(data); 13 let mapPointsCount = 0; 14 15 for(let pointIndex in mappoints){ 16 let pos = getPosition(mappoints[pointIndex][\'mWorldPos\']); 17 let pos_x = pos.x; 18 let pos_y = pos.y; 19 let pos_z = pos.z; 20 console.log(pos_x + \'\t\' + pos_y + \'\t\' + pos_z); 21 mapPointsCount ++; 22 writeToTxt(\'pos_x:\'+pos_x + \'\t\' + \'pos_y:\'+pos_y + \'\t\' + \'pos_z:\'+pos_z + \'\n\'); 23 } 24 console.log("Number of data : " + mapPointsCount); 25 } 26 } 27 ); 28 29 //定义的子函数 30 31 function getPosition (worldPos){ 32 var buf = worldPos[\'data\'][\'buffer\']; 33 return { 34 \'x\': buf.readFloatLE(0), 35 \'y\': buf.readFloatLE(4), 36 \'z\': buf.readFloatLE(8) 37 } 38 } 39 40 function writeToTxt(_data){ 41 fs.writeFile(fileName[1].toString(),_data,{flag:\'a\'},function(err){ 42 if(err) 43 console.log("文件写入失败") 44 }); 45 }