如何编码字节序列以避免重复?

时间:2018-06-05 15:23:10

标签: encoding

我目前无法解决问题,需要帮助。

我有发射器和接收器设备。发送器需要发送随机字节序列(可能重复)或未知长度。如果需要,可以在传输之前转换(编码)序列。

接收器设备按字节顺序接收序列。强烈要求在输入序列中没有重复的字节。每个新字节必须与之前收到的字节不同。

问题是如何在发送器端对输入字节序列进行编码以避免接收器输入字节序列中的重复? 输入序列的所有字节都应在接收端进行唯一解码。

我听说过扰乱者。据我了解,他们中的一些可以输出字节序列而不重复。但是有一些更简单的方法吗?

4 个答案:

答案 0 :(得分:1)

你可以发送数据作为8字节的填充组,7字节数据和一个特殊字节,其中有7位设置为0或1取决于它是否需要修改相应的数据字节(xor与FF或其他)使它们与以前不同。最后一位用于使该字节与最后一个数据不同。

原始数据:

0x00 0x00 0x00 0x00 0x00 0x00 0x00

数据包:

0x00 0xFF 0x00 0xFF 0x00 0xFF 0x00 0b01010100 <- last bit would be flipped if previous data byte is the same as this byte

注意:如果你没有8个字节的缓冲区,你可以先发送填充字节,然后将它保存在寄存器中,左/右移位并根据位值处理下一个字节。

答案 1 :(得分:1)

忽略第一个字节,不能重复字节的限制意味着每个字节代表一个255输入,而不是256个一个字节。这意味着您可以每字节发送少于8位(7.994353位)

因此,编码理论告诉我们您需要将256个符号的输入流转换为255个符号的流。然后,通过记住发出的前一个字节,对这个255符号的流进行编码。如果您要发送的符号低于您发送的上一个字节,则不加修改地发送,否则您发送+1。

解码算法是相反的。如果收到的字节高于先前接收的字节,则减1。

举个简单的例子,考虑发送254 254 254。第一个可以直接发送(第一个符号),第二个将发送为255(+1),下一个将再次发送254。因此,接收者看到254 255 254。唯一一个比前一个字节高的字节是255,所以从中减去一个以恢复初始序列254 254 254

这种编码是最有效的,我们只是将随机字节流(256个符号)映射到255个符号流的次要挑战。请记住,在这个255符号的代码中,允许重复 。这就是我们发明它的原因。

一个简单但效率低下的黑客攻击是将254替换为254 0,将255替换为254 1。缺点是这有效地为这两个输入使用15.998位。一个困难但非常节省空间的黑客是将整个输入视为基数为256的数字,并将其转换为基数为255.

您选择的具体内容可能取决于您的输入。

答案 2 :(得分:1)

一种简单的方法是将最高位用于唯一性,将低7位用于传输数据:

0xxxxxxx 1xyyyyyy 0yyzzzzz 1zzz....

这会将每7个字节的输入编码为连接上的8个字节。在发送器上,您有一位状态要在0和1之间切换,而一个0-6计数器用于可变位移。在接收器上,您甚至不需要解码顶部位,因此您只需要0-6计数器来反转位移。在两侧,您还需要保留一个字节的一部分,因此您需要大约2个字节的状态。但是,在FPGA或大约十几条ARM指令中,并不是太糟糕且无疑是可行的。

答案 3 :(得分:0)

你对使用一些软字节扰码器的想法有什么看法? 我的意思是一些简单的算法,而不是将原始字节流转换为伪随机序列而不重复?

是否有可能以这种方式可靠地避免重复?

只是想知道它是另一种可能的解决方案......