表示字节流中的比特流

时间:2011-01-03 17:08:09

标签: language-agnostic serialization stdout pipeline bitstream

我正在尝试一些思路,其中算法必须将位作为其最小的信息单元。这是一个模块化应用程序,用户可以像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"

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

目前,我有一个工作概念验证,通过将每个位扩展为0x30或0x31(“0”或“1”)的字节来实现。显然,这会使数据量增加8倍,占用的空间和带宽比所需的空间和带宽多8倍。我希望以更有效的方式填充这些位。

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

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

1 个答案:

答案 0 :(得分:1)

  

协议,用于缓冲输出中的位,并生成由Length头跟随ceiling(Length / 8)字节数据组成的块,并在适当时刷新输出。

这是典型的。实际上没有任何替代方案会非常简单。

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

Pascal编程语言编码所有字符串,其长度后跟字符串的字节。你做的是类似的东西,除了它的位,而不是字节。

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