是否有任何字节序列永远不会出现在gzip字节序列的末尾

时间:2018-03-22 01:30:38

标签: c# bluetooth gzip

我有一个表示gzip压缩json数组的字节数组。我通过蓝牙连接将这个数组以块(最多20个字节)发送到另一个设备。为了指示新传输的开始,我向另一个设备发送一些“重置字节”(表示我们有新传输的序列)。但是,为了使这种方法起作用,我需要确保重置字节在gzipped和chunked json数组不包含相同序列的意义上是唯一的。

以下剪辑显示了我使用的代码的缩短版本:

//the sequence I choose as reset sequence
var nullByteSeq = new byte[3] { 0x00, 0x00, 0x00 };
//send the reset sequence to device
var reseted = await characteristic.Write(nullByteSeq);


//messageJson is gzipped json format of a message
var messageJson = BluetoothHelper.GetMessageJson(message);

//header: first 10 bytes: message name - byte 10 to 19: message size
var header = BluetoothHelper.GetMessageHeader(message);
var written = await characteristic.Write(header);

while (bytesSentCounter < messageJson.Count()) {
    var toSend = messageJson.Skip(bytesSentCounter).Take(mtu).ToArray();
    var sent = await characteristic.Write(toSend);

    bytesSentCounter += toSend.Count();
}

如您所见,我使用三个0x00字节作为“重置字节”。但是,在某些情况下,messageJson采用这种格式,发送的最后一个块正好有三个0x00字节。

因此我的问题:是否有任何类型的字节序列永远不会出现在gzip字节序列的末尾?如果没有,我怎样才能实现我想要的目标?

2 个答案:

答案 0 :(得分:1)

To answer the original question, no. The end of a gzip stream is the number of uncompressed bytes represented in the last gzip member, modulo 232, in little-endian order. So for long enough inputs, the last four bytes can be anything. The four bytes before that is the CRC-32 of the uncompressed data, so the last eight bytes can be anything. Before that is compressed data, and that can be anything as well for a few thousand bytes.

答案 1 :(得分:0)

感谢@Name McChange我能够解决这个问题。

正如他所指出的,我使用base64编码从gzip字节数组中删除0x00字节。然而,我只是编码该数组的最后三个字节而不是base64编码整个字节数组。这就足够了,因为问题中描述的混淆只能在gzip数组的最后三个字节为0x00并且数组以这种方式分块时发生,即最后一次写入传输只包含三个字节。

我发布这个答案,希望它可以帮助某人。