我有一个表示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字节序列的末尾?如果没有,我怎样才能实现我想要的目标?
答案 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并且数组以这种方式分块时发生,即最后一次写入传输只包含三个字节。
我发布这个答案,希望它可以帮助某人。