【问题标题】:variable length data types inside a buffer in C [closed]C中缓冲区内的可变长度数据类型[关闭]
【发布时间】:2016-11-09 21:34:19
【问题描述】:

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

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

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

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

【问题讨论】:

  • 什么? XML 对您来说还不够好? :)
  • 我肯定会使用缓冲区的某些部分作为每个变量的标头。标头将存储数据类型的长度,可能还有一个枚举 int 来表示数据类型。然后,您可以编写一个转换函数以在需要时进行类型转换。
  • @infixed:你不能在所有平台上都使用 XML! XML 太臃肿了。
  • @Olaf 这显然是个玩笑,看笑脸。显然,OP 正在尝试创建一种非常紧凑的格式,而 XML 是它的对立面。
  • 查找 TLV(类型长度值)编码技术。您可以在每条消息的级别执行“类型”,因此消息类型 1 表示 4+1+3+8x8+13 位,可以在没有太多长度的情况下解包。或者您可以将每组位编码为 8 位的倍数,并在它们前面加上“类型位”和“长度 N”,其中 N 以合适的位数编码,等等。选项是无穷无尽的;这取决于消息的多样性,以及大量客户编码器和解码器与一个通用编码器和一个通用解码器的相对成本。

标签: c serialization bit-manipulation


【解决方案1】:

真正困难的部分是长度的编码。

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

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

如果您想变得更漂亮,并且您有一组已知的位长度要处理,您可以创建一个 Huffman Code 来表示长度,然后将 Huffman 代码与实际位值交替。

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

您甚至可以使用霍夫曼编码来实现我上面 cmets 中的 ASCII 方案,但用霍夫曼编码代替“0”、“1”和“x”

单个零位的序列表示字段中的下一位是'0'

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

1 后跟 0 的序列可能与 'x, end of field 的含义相同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多