我正在尝试一些想法,其中算法必须将比特作为最小的信息单位。这是一个模块化应用程序,用户可以像 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"
问题是如何有效地序列化这些位,因为标准流 (stdin
和stdout
) 是面向字节的。我必须处理输入和输出中的位数不是一个字节的倍数的情况。
目前,我有一个有效的概念验证,它通过将每个位扩展为 0x30 或 0x31(“0”或“1”)的字节来实现。显然,这将数据大小增加了 8 倍,消耗的空间和带宽是必要的 8 倍。我希望以更有效的方式打包这些位。
我正在考虑的一种替代方案是一种协议,它缓冲输出中的位并生成由Length标头后跟数据上限(Length/8)字节组成的块,并在适当的时候刷新输出。
但不是创建一个虚构的协议,我想知道是否有人已经有这些要求,你的经验是什么,以及是否已经有一些标准协议(任意位数的序列化)我可以利用。也许有人已经遇到了这个问题,并且已经在使用某种形式的编码,也可以在这个应用程序中使用,以避免不兼容格式的扩散。