我正在实验一些想法,其中算法必须工作比特作为他们最小的信息单位。这是一个模块化的应用程序,用户可以像unix管道一样重新排列“管道”的部分。这些算法具有帧、压缩、解压缩、纠错、引入、检测和消除噪声等多种功能。
由于它们在位级上工作,因此这些算法可以,例如,接受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"问题是如何有效地序列化这些位,因为标准流(stdin和stdout)是面向字节的。我必须处理输入和输出中的位数不是一个字节的倍数的情况。
目前,我有一个概念的工作证明,通过将每个位展开为0x30或0x31 ("0“或"1")的字节。显然,这会使数据的大小增加8倍,占用8×10的空间和带宽。我希望以更有效的方式包装这些部分。
我正在考虑的另一种选择是一种协议,它缓冲输出中的位,并生成由一个长度头和最高(长度/8)字节的数据组成的块,并在适当的时候刷新输出。
但是,我不想创建一个虚构的协议,我想知道是否有人已经有了这些要求,您的经验是什么,以及是否已经有一些标准的协议(任意数量的位的序列化),我可以使用。也许有人已经有了这个问题,并且已经在使用某种形式的编码,也可以在这个应用程序中使用,以避免不兼容格式的扩散。
发布于 2011-01-03 17:31:57
协议,它缓冲输出中的位,并生成由长度头和上限(长度/8)字节组成的块,并在适当的时候刷新输出。
这是典型的。没有任何合适的选择是简单的。
比特的序列化--作为位--是很少见的。位图索引是脑海中唯一的例子。
Pascal编程语言用长度和字符串的字节对所有字符串进行编码。你做的是类似的事情,除了比特,而不是字节。
这类似于“运行长度编码”,其中相同值的运行被头和字节替换。例如,PackBits算法是一个简单的RLE,它提供头部和数据。它在字节级别(不是位级)工作,但本质上是相同的设计模式。
https://stackoverflow.com/questions/4586546
复制相似问题