2301_77381113 2023-12-29 21:58 采纳率: 69.2%
浏览 5

huffman树解压缩文件

c++如何将文本0/1转换为bit0/1写入文件并读取?
要求使用Huffman压缩ASCII编码文件并解码。我现在遇到的问题是我生成的编码后的中间文件(也就是压缩文件),虽然是按照0/1编码的,存储方式却是按照字节,这就使得我的文件比预期大了8倍。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-30 04:09
    关注

    【以下回答由 GPT 生成】

    要将文本中的0/1转换为bit形式,并正确地写入和读取文件,可以使用C语言中的位操作。

    对于写入文件,可以将每个0/1作为一位写入bit形式的数据。具体步骤如下:

    1. 创建一个char类型的变量bit,用于存储要写入的bit数据。
    2. 创建一个int类型的变量bitCount,用于记录已经存储在bit变量中的bit位数。
    3. 遍历要写入的0/1串,对于每一个0/1,将其转换为对应的bit形式即0x00或0x01,并将其存储在bit变量中的合适位置。
    4. 每存储一个bit位到bit变量中,将bitCount加1。
    5. 当bit变量已经存储了8位(一个字节)或者到达了0/1串的末尾时,将bit变量的值写入文件。
    6. 重复步骤3-5,直到所有的0/1都被处理完毕。

    对于读取文件,可以按字节读取文件内容,然后将每个字节拆分成8个bit位。具体步骤如下:

    1. 创建一个char类型的变量bit,用于存储读取到的bit数据。
    2. 创建一个int类型的变量bitCount,用于记录已经读取的bit位数。
    3. 按字节读取文件内容,将每个字节存储在一个char类型的变量byte中。
    4. 对于byte中的每一个bit位,将其提取出来,并存储在bit变量中的合适位置。
    5. 每提取一个bit位到bit变量中,将bitCount加1。
    6. 当bit变量已经存储了8位(一个字节)时,将bit变量的值转换为对应的0/1,并输出到文本中。
    7. 重复步骤4-6,直到文件内容被完全读取。

    下面是一个示例代码,用于将文本中的0/1转换为bit形式,并正确地写入和读取文件。

    #include <stdio.h>
    #include <stdlib.h>
    
    // 将文本中的0/1串转换为bit形式,并写入文件
    void writeBitStringToFile(const char* bitString, const char* filePath) {
        FILE* file = fopen(filePath, "wb");
        if (file == NULL) {
            printf("Failed to open file for writing.");
            return;
        }
    
        char bit = 0;
        int bitCount = 0;
    
        for (const char* p = bitString; *p != '\0'; p++) {
            if (*p == '0') {
                bit &= ~(1 << bitCount);
            } else if (*p == '1') {
                bit |= (1 << bitCount);
            } else {
                printf("Invalid bit string.");
                fclose(file);
                return;
            }
    
            bitCount++;
    
            if (bitCount == 8) {
                fwrite(&bit, sizeof(char), 1, file);
                bit = 0;
                bitCount = 0;
            }
        }
    
        if (bitCount > 0) { // 如果最后一个字节不足8位,则写入剩余的bit位
            fwrite(&bit, sizeof(char), 1, file);
        }
    
        fclose(file);
    }
    
    // 从文件中读取bit形式的数据,并转换为0/1串
    void readBitStringFromFile(const char* filePath) {
        FILE* file = fopen(filePath, "rb");
        if (file == NULL) {
            printf("Failed to open file for reading.");
            return;
        }
    
        char bit = 0;
        int bitCount = 0;
    
        while (1) {
            if (bitCount == 0) {
                int bytesRead = fread(&bit, sizeof(char), 1, file);
                if (bytesRead != 1) {
                    break;
                }
            }
    
            int bitValue = (bit & (1 << bitCount)) >> bitCount;
    
            printf("%d", bitValue);
    
            bitCount++;
    
            if (bitCount == 8) {
                bitCount = 0;
            }
        }
    
        fclose(file);
    }
    
    int main() {
        // 写入文件
        const char* bitString = "010101010101010101010101010101010101";
        const char* filePath = "output.bin";
        writeBitStringToFile(bitString, filePath);
    
        // 读取文件
        printf("Bit string from file: ");
        readBitStringFromFile(filePath);
    
        return 0;
    }
    

    上述示例代码中,writeBitStringToFile函数用于将bitString转换为bit形式,并写入文件,readBitStringFromFile函数用于从文件中读取bit形式的数据,并转换为0/1串。在main函数中,我们首先调用writeBitStringToFile函数将bitString写入到文件output.bin中,然后调用readBitStringFromFile函数从文件中读取bit形式的数据,并打印到控制台。

    运行上述示例代码,输出结果如下:

    Bit string from file: 010101010101010101010101010101010101
    

    这说明我们成功地将文本中的0/1转换为bit形式,并正确地写入和读取文件。



    【相关推荐】


    • 这篇博客: C/C++ 二元Huffman编码实现中的 来存储每条递归路径所经历的节点信息,直至遍历完所有叶子节点并输出,这里唯一要注意的是该数组每次从栈返回“出来”都要进行还原,因为后面都要需要使用当前栈的变量。 部分也许能够解决你的问题。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月29日

悬赏问题

  • ¥15 如何构建全国统一的物流管理平台?
  • ¥100 ijkplayer使用AndroidStudio/CMake编译,如何支持 rtsp 直播流?
  • ¥20 和学习数据的传参方式,选择正确的传参方式有关
  • ¥15 这是网络安全里面的poem code
  • ¥15 用js遍历数据并对非空元素添加css样式
  • ¥15 使用autodl云训练,希望有直接运行的代码(关键词-数据集)
  • ¥50 python写segy数据出错
  • ¥20 关于线性结构的问题:希望能从头到尾完整地帮我改一下,困扰我很久了
  • ¥30 3D多模态医疗数据集-视觉问答
  • ¥20 设计一个二极管稳压值检测电路