我的任务是创建一个node.js程序,该程序有三个主要组件:侦听传入数据(以压缩二进制形式出现),解压缩并解析该数据,然后将其发布到postgreSQL数据库。我遇到的问题是,目前提供的所有npm库节点都不能很好地解压缩条件格式。
数据采用一般格式:
标题。这个片段在每个输入数据包上固定为20个字节,因此易于解析。
第一个信息部分。这个长度可变。
第二个信息部分。这个长度可变。
第三个信息部分。这个长度可变。
幸运的是,每个部分的长度都是前两个字节。
我有一个指南告诉我每个信息包将在标题中使用多长时间使用bufferpack和binary npm库来解析数据。对于第一个信息包,我不够幸运,有一个固定的指南:
var binary = require('binary');
var bufferpack = require('bufferpack');
//The data is received as a buffer in the main program.
exports.execute = function (data) {
//The first piece of information is 8 bytes thus requiring
//using binary npm. It is also big endian unsigned.
//Bytes 0 - 7:
var info1 = binary.parse(data).word64bu('data1').vars;
//The next info packet is 1 unsigned byte.
var info2 = bufferpack.unpack('B', data, 8);
//The next info packet is 9 bytes long, but is not collected
//because it is not required.
//The last packet then is 2 bytes long, little endian unsigned
//Bytes 18 - 19:
var info3 = bufferpack.unpack('<H', data, 18);
//End of header.
//The above code runs fine and returns the expected values correctly.
//However, the next section of data comes in as conditional and presents
//plenty of problems:
//Luckily, I am given the length of the next piece of data.
var firstSectionLength = bufferpack.unpack('<H', data, 20);
//Next, three data packets will be sent, each containing 1-30
//Bytes of data. This is my current solution:
var firstSectionInfo = bufferpack.unpack((modemInfoLength).toString() + 's', data, 22);
//The next two information sections follow the same patter as the above.
console.log(firstSectionInfo);
};
此代码将数组记录到控制台,该控制台将每个数据引入第一个索引,用'/ u0000'分隔。由于它是一个数组,我不能简单地.split()它。但是,如果我.toString()数组它将返回一个字符串,但删除'/ u0000'部分留下我所有数据串在一起,没有办法拆分它们。由于它们的长度都是可变的,因此我无法制作地图以提取字符串的切片作为有用信息。
有没有办法更有效地解析数据包或可靠地解析索引数组值?
我将添加以前的python代码用于进行解析,如下所示:
def dataPacket(self, data, (host, port)):
#I'll skip directly to how the first information section is parsed
#...
#Recall the header is fixed at 20 bytes.
firstInfoSectionLength = unpack('H', data[20:22])
firstInfoSectionBegin = 22
firstInfoSectionEnd = firstInfoSectionBegin + firstInfoSectionLength[0]
firstInfoSection = '%r' % data[firstInfoSectionBegin:firstInfoSectionEnd]
firstInfoSection = firstInfoSection.strip("'")
firstInfoSection = firstInfoSection.split('\\x00')
data1 = firstInfoSection[0]
data2 = firstInfoSection[1]
data3 = firstInfoSection[2]
data4 = firstInfoSection[3]
data5 = firstInfoSection[4]
正如您将注意到的,python程序用不同的参数解析变量信息长度,然后我需要在node.js程序中解析它。
由于
答案 0 :(得分:0)
如果firstSectionInfo
中的内容是:
['ab\u0000cd\u0000']
我认为您想要拆分数组中唯一的值。所以你可以这样做:
['ab\u0000cd\u0000'][0].split('\u0000')
您将获得值'ab'
,'cd'
和''
(顺便说一句,你一直在写/u0000
,但这与Python的\x00
无法对应。)