我正在尝试一些思路,其中算法必须将位作为其最小的信息单元。这是一个模块化应用程序,用户可以像unix shell管道一样重新排列“管道”的部分。这些算法可以执行各种操作,例如取景,压缩,解压缩,错误检查和纠正;引入,检测和消除噪音等
由于它们在位级上工作,因此算法可以例如采用5位输入并产生19位输出。输入和输出很少是字节的倍数。
在std::vector<bool>
的帮助下,在内存和线程之间使用位流很好,但是我必须从/到某处检索并存储这个位流,并且最好能够执行实际命令-line管道如:
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 标头组成的块,后跟 ceiling(Length / 8)数据字节,在适当的时候刷新输出。
但是我不想创建一个伪造的协议,我想知道是否有人已经有这些要求,你的经验是什么,以及是否已经有一些标准协议(序列化任意数量的位)我可以用。也许某人已经遇到了这个问题,并且已经在使用某种形式的编码,这种编码也可以在这个应用程序中使用,以避免不兼容格式的泛滥。
答案 0 :(得分:1)
协议,用于缓冲输出中的位,并生成由Length头跟随ceiling(Length / 8)字节数据组成的块,并在适当时刷新输出。
这是典型的。实际上没有任何替代方案会非常简单。
比特序列化 - 作为比特 - 很少见。位图索引是我想到的唯一例子。
Pascal编程语言编码所有字符串,其长度后跟字符串的字节。你做的是类似的东西,除了它的位,而不是字节。
这类似于“运行长度编码”,其中相同值的运行由标头和字节替换。例如,PackBits算法是一个提供标题加数据的简单RLE。它工作在字节级(不是位级),但它基本上是相同的设计模式。