2016-11-09 90 views
-3

处理放入uint8缓冲区的可变数位数据串行化的最简单方法是什么?C中缓冲区内的可变长度数据类型C

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

的变量数据类型有时不对准在8个-16位边界,它们具有类似的7位位的怪异#长,13位长,3位长,等等

难道最好写用C写这个东西,还是用第三方库?

+0

什么? XML对你来说不够好? :) – infixed

+0

我肯定会使用缓冲区的一部分作为每个变量的标题。标题将存储数据类型的长度以及可能枚举的int来表示数据类型。然后,当你想使用它的时候,你可以写一个转换函数给typecast。 – SenselessCoder

+0

@infixed:您无法在所有平台上使用XML! XML膨胀。 – Olaf

回答

1

艰难的部分确实是长度的编码。例如,如果你从来没有超过255位的长度(假设没有零位选项),那么你将采取流中接下来的8位来获得长度,然后将该位数获得价值。

你也可以分段做。使用零作为长度意味着大于255的长度。因此,您可以读取255位,然后将它们添加到下一个段(具有类似定义的长度),因此您可以继续链接,只要您想要,

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

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

你甚至可以使用霍夫曼编码来实现我的ASCII方案从上面的评论,但用霍夫曼代码取代'0','1'和“X”

单个零比特的序列是指在该领域的下一个位为“0”

接着另一个之一的序列的含义的下一个比特是“1”

其中一个跟着零的序列可能意味着与'x'相同的末尾