C——按位压缩和解压缩

标签 c bit bit-shift compression

我想知道一件事。我有几个包含四个字符的 *.txt 文件(每个字符多个)。文件中的字符为:' '、':'。 “@”和“\n”。

我想要做的是将这些标准 ASCII 字符替换为使用较少位的字符。 ' ' 应替换为 00,':' 应替换为 01,'@' 应替换为 01,'\n' 应替换为 02。

这个想法是压缩,然后可以再次解压缩文件。

问题是,我的代码不起作用 - 我不明白为什么。

如有任何帮助,我们将不胜感激。

最佳答案

  1. 您的compress函数尝试打开文件以使用rb+进行写入。它 如果文件不存在,则触发段错误。顺便说一句,你必须 使用wb+来编写它。

    fp = fopen(文件, "wb+");

    始终检查 fopen 的返回以避免访问 null 文件描述符。

  2. 当您将文件从压缩文件读取到 container 中时,您无法使用 strlen 计算长度,因为它在第一个 '\0 处停止' 字符(0x00)。例如。您的压缩将 ' '(空格或 0x20)更改为 0x00。这意味着 strlen 给出了该字符之前的长度。

  3. 变量newCounter,第一次在for循环中是0,它不受if-elseif管理。您的代码应该是:

<小时/>
   if(newCounter == 0)      swapped |= counter << 6;
   else if(newCounter == 1) swapped |= counter << 4;
   else if(newCounter == 2) swapped |= counter << 2;
   else                     swapped |= counter;

关于C——按位压缩和解压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32986026/

相关文章:

java - 如何将 32 位 int 移位 32(再次)

c - 如何在 C 中检查数组重复项

c - .lib 中的函数已定义,但当我从同一个 .lib 生成 .so 时,该函数不存在

c - for 循环中的参数,缺少第一个?

java - 二元补码运算符 (~) 无法正常工作(或者我不知道如何使用它)

c - 我一直在尝试编写一个程序将十进制转换为二进制,我不知道我的代码有什么问题?我正在使用代码块

c - 为什么在使用 fprintf 时不会打印到标准输出?

c - 如何更正以下有关匹配位模式的代码?

c++ - 从二进制编码中提取小时、分钟和秒

c - c中的左移位