我正在尝试一些想法,其中算法必须将其作为最小的信息单位工作。这是一个模块化应用程序,用户可以像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×。我想以更有效的方式包装这些位。

我正在考虑的一种替代方案是一种协议,该协议缓冲了输出中的位并产生由一个组成的块 长度 标头跟着 天花板(长度/8) 数据字节,随时随地刷输出。

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

有帮助吗?

解决方案

协议缓冲到输出中的位并产生由长度标头的块,然后是天花板(长度/8)字节的数据,并随时随地冲洗输出。

这是典型的。实际上,没有什么可以简单的选择。

位的序列化 - 作为位 - 很少见。位图索引是想到的唯一示例。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top