自定义压缩算法

标签 c compression

我正在用 C 编写一个自定义压缩算法,它读取 ascii 字符,从每个字符中删除第一个位(因为它始终为 0),然后将其粘贴到一个新文件中。它使输入成为原始大小的 7/8。这是压缩:

#include <stdio.h>

int main()
{
  int i = 1;
  int c;
  unsigned short value = 0;

  while((c = getchar()) != EOF)
  {
    value = (c << i) | value;
    if(i != 1) putchar(value >> 8);
    value = value << 8;
    i++;
    if(i == 9) i = 1;
  }
  if(i != 1) putchar(value >> 8);
}

这里是解压:

#include <stdio.h>

int main() {

  int i = 1;
  int c;
  unsigned char value = 0;

  while((c = getchar()) != EOF) {
    value = (c >> i) | value;
    putchar(value);

    value = (c << (8-i)) | 0;
    value = value >> 1;

    if(++i == 8) {
      putchar(value);
      i = 1;
    }
  }
}

如果我压缩类似“ororororor”(不带引号)的内容,然后将其解压缩,则输出为“orororor.r”,其中“.”在十六进制中是 7F。但是,如果我给它“ororororrr”,那么它会输出正确的“ororororrr”。它仅在某些输入时失败,但我找不到它何时出错的模式。

抱歉,这不在函数中。我一直使用它的方式是在 UNIX 中使用这些命令:

echo -n your input here > data
gcc compress.c
./a.out < data > inp
gcc decompress.c
./a.out < inp > out
hexdump -C out

最佳答案

问题肯定是你在解压时没有将 value 归零。

在到达文件末尾之前,这没有任何效果(多余的位被轮换掉)。

尝试:

 if(++i == 8) {
     putchar(value);
     i = 1;
     value = 0; // Clean up
 }

测试用例(如果有命令行参数,则将上述程序修改为只有零 value):

  echo "xxxxxxxRxx" | ./comp | ./decomp OK
  xxxxxxxRxx
  echo "xxxxxxxRxx" | ./comp | ./decomp
  xxxxxxxRzx

关于自定义压缩算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12414992/

相关文章:

C:制作图像映射缓冲区副本的最佳方法

java - 将无符号类型的按位运算符迁移到 java(无无符号类型)

Java:在没有 KeyListener 或使用任何其他自定义类的情况下捕获按键事件

delphi - Delphi 2009 中的 Zlib

javascript - C# 相当于 LZMA-JS 压缩

linux中的C用户名——获取当前用户名

c++ - 去掉doxygen的\copydoc的点?

unzip - 将 bz2 文件解压到 Azure 存储时不允许操作

flash - SWF 闪存文件未加载 IIS 压缩

c - 为什么不能使用 extern 关键字来初始化外部变量?