C中缓冲区内的可变长度数据类型

时间:2016-11-09 21:34:20

标签: c serialization bit-manipulation

处理放入uint8缓冲区的可变位数数据序列化的最简单方法是什么?

例如,前4位是一个变量,然后1位是布尔值,另一位是3位长。然后你有一个8字节的数组,然后是13位变量,依此类推。所有这些都将写入一个unsigned char缓冲区,通过套接字发送。

变量数据类型有时不在8位-16位边界上对齐,它们有奇怪的位数,如7位长,13位长,3位长等。

最好是用C语言写一些东西,还是使用第三方库?

1 个答案:

答案 0 :(得分:1)

困难的部分确实是长度的编码。

例如,如果您的长度不超过255位(假设没有零位选项),那么您将获取流中的下一个8位来获取长度,然后获取该位数价值。

您也可以分段进行。使用零作为长度意味着长度大于255.因此,您读取255位,然后将这些前缀添加到下一个段(具有相似定义的长度),因此您可以根据需要保持链接,

如果你想获得更好的,并且你有一组已知的比特长度要处理,你可以用Huffman Code表示长度,然后用实际的比特值交替使用霍夫曼码。

但这需要提前了解可能的长度。但你可以保留一个霍夫曼代码来说'链接到下一个'也是

你甚至可以使用霍夫曼编码从上面的评论中实现我的ASCII方案,但用霍夫曼代码代替'0','1'和'x'

单个零位的序列表示该字段中的下一位为“0”

一个序列后跟另一个序列意味着下一位是'1'

一个跟随零的序列可能与'x,字段结尾

相同