C - 按位压缩和解压缩
C - bitwise compression and decompression
我想知道一件事。我有几个包含四个字符(每个字符的倍数)的 *.txt 文件。文件中的字符为:' '、':'。 '@' 和 '\n'。
我想做的是将那些标准的 ASCII 字符替换为使用更少位的字符。 ' ' 应与 00 交换,':' 应与 01 交换,'@' 应与 01 交换,'\n' 应与 02 交换。
想法是压缩文件,以后有可能再次解压文件。
问题是,我的代码不起作用 - 我不知道为什么。
如有任何帮助,我们将不胜感激。
您的 compress
函数尝试打开要用 rb+
写入的文件。它
如果文件不存在则触发分段错误。顺便说一句,你必须
用wb+
来写。
fp = fopen(文件,"wb+");
始终检查 fopen 的 return 以避免访问 null
文件描述符。
当您将压缩文件中的文件读入 container
时,您无法使用 strlen
计算长度,因为它在第一个 '\0' 字符处停止(0x00)。例如。您的压缩将 ' '
(space 或 0x20)更改为 0x00。这意味着 strlen 为您提供了该字符之前的长度。
变量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 库中的 read
和 write
函数。使用不同的名称或使这些 static
.
实际上建议在您的程序中制作所有本地函数static
。这最大限度地降低了冲突的风险,并允许编译器执行更好的优化。
您的代码中还有其他问题,但这个问题阻止了所有调试尝试。
我想知道一件事。我有几个包含四个字符(每个字符的倍数)的 *.txt 文件。文件中的字符为:' '、':'。 '@' 和 '\n'。
我想做的是将那些标准的 ASCII 字符替换为使用更少位的字符。 ' ' 应与 00 交换,':' 应与 01 交换,'@' 应与 01 交换,'\n' 应与 02 交换。
想法是压缩文件,以后有可能再次解压文件。
问题是,我的代码不起作用 - 我不知道为什么。
如有任何帮助,我们将不胜感激。
您的
compress
函数尝试打开要用rb+
写入的文件。它 如果文件不存在则触发分段错误。顺便说一句,你必须 用wb+
来写。fp = fopen(文件,"wb+");
始终检查 fopen 的 return 以避免访问
null
文件描述符。当您将压缩文件中的文件读入
container
时,您无法使用strlen
计算长度,因为它在第一个 '\0' 字符处停止(0x00)。例如。您的压缩将' '
(space 或 0x20)更改为 0x00。这意味着 strlen 为您提供了该字符之前的长度。变量
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 库中的 read
和 write
函数。使用不同的名称或使这些 static
.
实际上建议在您的程序中制作所有本地函数static
。这最大限度地降低了冲突的风险,并允许编译器执行更好的优化。
您的代码中还有其他问题,但这个问题阻止了所有调试尝试。