如何逐位读取二进制文件?

问题描述 投票:0回答:1

我正在开发一个使用霍夫曼算法压缩/解压缩文本文件的项目。我已经成功地将给定的文本文件压缩为二进制文件——我已经检查了 Visual Studio Hex 编辑器扩展,它工作正常。

但是,我真的不知道如何实施减压。我想做的是逐位读取二进制文件,遍历相应的霍夫曼树,并在到达叶子时写入一个字符。但是,我不确定如何逐位读取二进制文件(我知道它不能直接按原样完成:当然我必须首先进行位操作来实现压缩) .

我尝试过使用 fread() 函数将这些位存储到缓冲区中,但坦率地说,我认为我误解了它的工作原理,并且我不确定要为缓冲区提供多少内存,也不知道如何从缓冲区中检索位,缓冲区是一个字符数组。

预先感谢您的帮助。

c binary binaryfiles huffman-code
1个回答
1
投票

假设:小端。

/*
 * Read the next bit from the stream; *state is the additional state.
 * The starting value of *state needs to be 0x800
 * Return 0 if bit is 0, 1 is bit is 1, -1 if EOF encountered */
int read_next_bit(FILE *stream, int *state)
{
    if (*state == -1) return -1;
    int shift = (state & 0xF00) >> 8;
    if (shift == 8) {
        *state = getc(stream);
        if (*state == -1) return -1;
    }
    *state = (*state & 0xFF) | ((shift + 1) << 8);
    return (*state >> shift) & 1;
}

如果您需要大尾数,请调整为从 7 开始移位并减去 1,然后测试移位 0 而不是 8。

© www.soinside.com 2019 - 2024. All rights reserved.