使用Node.js进行条件二进制解包

时间:2014-02-03 18:43:31

标签: node.js binary conditional unpack

我的任务是创建一个node.js程序,该程序有三个主要组件:侦听传入数据(以压缩二进制形式出现),解压缩并解析该数据,然后将其发布到postgreSQL数据库。我遇到的问题是,目前提供的所有npm库节点都不能很好地解压缩条件格式。

数据采用一般格式:

  1. 标题。这个片段在每个输入数据包上固定为20个字节,因此易于解析。

  2. 第一个信息部分。这个长度可变。

  3. 第二个信息部分。这个长度可变。

  4. 第三个信息部分。这个长度可变。

  5. 幸运的是,每个部分的长度都是前两个字节。

    我有一个指南告诉我每个信息包将在标题中使用多长时间使用bufferpackbinary 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程序中解析它。

    由于

1 个答案:

答案 0 :(得分:0)

如果firstSectionInfo中的内容是:

['ab\u0000cd\u0000']

我认为您想要拆分数组中唯一的值。所以你可以这样做:

['ab\u0000cd\u0000'][0].split('\u0000')

您将获得值'ab''cd'''

(顺便说一句,你一直在写/u0000,但这与Python的\x00无法对应。)