1

我正在尝试一些想法,其中算法必须将比特作为最小的信息单位。这是一个模块化应用程序,用户可以像 unix shell 管道一样重新排列“管道”的一部分。这些算法做各种各样的事情,比如成帧、压缩、解压缩、错误检查和纠正;引入、检测和去除噪声等。

由于它们在位级别上工作,因此算法可能会采用 5 位输入并产生 19 位输出。输入和输出很少是字节的倍数。

借助std::vector<bool>_

prog1 < bitsource.dat | prog2 -opts | prog3 -opts > bitsink.dat

甚至:

prog1 | prog2 | ssh user@host /bin/sh -c "prog3 | prog4 > /dev/dsp"

问题是如何有效地序列化这些位,因为标准流 (stdinstdout) 是面向字节的。我必须处理输入和输出中的位数不是一个字节的倍数的情况。

目前,我有一个有效的概念验证,它通过将每个位扩展为 0x30 或 0x31(“0”或“1”)的字节来实现。显然,这将数据大小增加了 8 倍,消耗的空间和带宽是必要的 8 倍。我希望以更有效的方式打包这些位。

我正在考虑的一种替代方案是一种协议,它缓冲输出中的位并生成由Length标头后跟数据上限(Length/8)字节组成的块,并在适当的时候刷新输出。

但不是创建一个虚构的协议,我想知道是否有人已经有这些要求,你的经验是什么,以及是否已经有一些标准协议(任意位数的序列化)我可以利用。也许有人已经遇到了这个问题,并且已经在使用某种形式的编码,也可以在这个应用程序中使用,以避免不兼容格式的扩散。

4

1 回答 1

1

协议缓冲输出中的位并生成由 Length 标头后跟数据上限(Length/8)字节组成的块,并在适当的时候刷新输出。

这是典型的。真的没有任何替代方案可以适当地简单。

位的序列化——作为位——是罕见的。位图索引是唯一能想到的例子。

Pascal 编程语言对所有字符串进行编码,长度后跟字符串的字节。您正在做类似的事情,除了它是位,而不是字节。

这类似于“运行长度编码”,其中相同值的运行被标头和字节替换。例如,PackBits 算法是一个简单的 RLE,它提供标头加数据。它在字节级别(而不是位级别)工作,但它本质上是相同的设计模式。

于 2011-01-03T17:31:57.880 回答