听起来像你试图做类似霍夫曼压缩计划的东西?我只需逐字节(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'流的其余部分。您还需要处理符号值从一个字节溢出到下一个字节的情况。
这里是我对类似的答案问题在这里: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
通常的方法是打包位,但这需要逻辑知道另一边的位数。您可能会逐个解码,以了解您何时到达符号的末尾。 – 2012-07-16 22:33:18
你的问题涉及到编码领域。霍夫曼编码,如下所述,是一种选择。但也有其他的,因为霍夫曼编码不是唯一的(但它肯定是最受欢迎的)。请参阅Moffat和Turpin的书“Compression and Coding Algorithms”。大多数压缩书都有关于编码的内容。本书着重于编码。在“硬性时间分离”方面,您需要一个无前缀的代码 - 没有代码是任何其他的前缀。 – Ray 2012-08-07 03:42:37