我正在考虑使用 C 将一些数据写入比特流。有两种方法可以考虑。一种是将可变比特长度符号连接成连续的比特序列,但是以这种方式,我的解码器可能很难将这些符号与该连续比特流分开。另一种方法是为符号分配相同数量的比特,并且以这种方式解码器可以容易地恢复原始数据,但是可能存在比特的浪费,因为符号具有不同的值,这反过来导致比特流中的许多比特零(我猜这个废物比特)。
任何暗示我应该做什么?
我是编程新手。任何帮助将不胜感激。
答案 0 :(得分:3)
听起来像是在尝试做一些类似于霍夫曼压缩方案的事情?我会逐字节(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&#39 ;,那么如果该流是' 1011101',它将匹配第一个' 101'并将继续匹配流的其余部分' 1101'您还必须处理符号值从一个字节溢出到下一个字节的情况。