2012-07-16 77 views
7

我正在考虑使用C将一些数据写入比特流。有两种方法可以记住。一种方法是将可变比特长度的符号连接成一个连续的比特序列,但这样我的解码器很可能会很难将这些符号从这个连续的比特流中分离出来。另一种方式是分配相同数量的符号位,并且以这种方式解码器可以容易地恢复原始数据,但是可能会浪费比特,因为符号具有不同的值,这又导致比特流中的许多比特是零(我猜这是浪费)。如何编写比特流

任何提示我该怎么办?

我是编程新手。任何帮助将不胜感激。

+0

这里是我对类似的答案问题在这里:http:// stac koverflow.com/questions/11253123/how-can-i-print-a-bit-instead-of-byte-in-a-file/11253310#11253310 – 2012-07-16 22:31:49

+0

通常的方法是打包位,但这需要逻辑知道另一边的位数。您可能会逐个解码,以了解您何时到达符号的末尾。 – 2012-07-16 22:33:18

+1

你的问题涉及到编码领域。霍夫曼编码,如下所述,是一种选择。但也有其他的,因为霍夫曼编码不是唯一的(但它肯定是最受欢迎的)。请参阅Moffat和Turpin的书“Compression and Coding Algorithms”。大多数压缩书都有关于编码的内容。本书着重于编码。在“硬性时间分离”方面,您需要一个无前缀的代码 - 没有代码是任何其他的前缀。 – Ray 2012-08-07 03:42:37

回答

2

听起来像你试图做类似霍夫曼压缩计划的东西?我只需逐字节(char)并跟踪读取最后一个符号的字节内的偏移量。

假设您的任何符号都不会比char大。这将是这个样子:

struct bitstream { 
    char *data; 
    int data_size;   // size of 'data' array 
    int last_bit_offset;  // last bit in the stream 

    int current_data_offset; // position in 'data', i.e. data[current_data_offset] is current reading/writing byte 
    int current_bit_offset; // which bit we are currently reading/writing 
} 

char decodeNextSymbol(bitstream *bs) { 

} 

int encodeNextSymbol(bitstream *bs, char symbol) { 

} 

为decodeNextSymbol和encodeNextSymbol匹配代码必须使用C位运算( '&'(按位AND),和 '|'(按位OR)比如我。然后会列出我所有的符号,从最短的开始,然后做一个匹配最短符号的while循环,例如,如果其中一个符号是'101',那么如果流是'1011101' ,它将匹配第一个'101'并且将继续匹配'1101'流的其余部分。您还需要处理符号值从一个字节溢出到下一个字节的情况。