2012-09-13 96 views
1

我正在写一个自定义压缩算法在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”,那么它输出“orororrr”,这是正确的。它只有在某些输入时才会失败,但我无法找到一个模式来解决它。

对不起,这不是功能。我一直在使用它的方式是在UNIX中使用以下命令:

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

回答

1

一个问题是肯定的,当你解压缩时,你不会0 value

这不起作用(额外的位被旋出)直到你到达文件的末尾。

尝试:

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

测试用例(修改上面的程序,以只零value,如果有一个命令行参数):

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

即固定它!我以为我正在用'value = c << 8-i |将它归零0',因为它或0或0,但我想这不是正确清除它的第8个字符。 – mottese

1

您是否考虑了输入不会落在8位边界上的情况?有点像基地64编码问题,当它做同样的事情...