C - 按位压缩和解压缩

C - bitwise compression and decompression

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

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

想法是压缩文件,以后有可能再次解压文件。

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

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

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

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

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

  2. 当您将压缩文件中的文件读入 container 时,您无法使用 strlen 计算长度,因为它在第一个 '\0' 字符处停止(0x00)。例如。您的压缩将 ' '(space 或 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;

您正在重新定义 POSIX 库中的 readwrite 函数。使用不同的名称或使这些 static.

实际上建议在您的程序中制作所有本地函数static。这最大限度地降低了冲突的风险,并允许编译器执行更好的优化。

您的代码中还有其他问题,但这个问题阻止了所有调试尝试。