2012-09-13 98 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編碼問題,當它做同樣的事情...