2012-09-13 4 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); 
} 

을 여기에 압축 해제입니다 : 여기에 압축이다, 출력은 "orororor.r이

#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 "같은 것을 압축하고 압축을 해제하는 경우입니다 ",". " 16 진수는 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 

답변

1

압축을 풀 때 문제가 발생하면 value을 0으로 설정하지 마십시오.

파일 끝에 도달 할 때까지 효과가 없습니다 (여분의 비트가 회전됩니다).

보십시오

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

를 해결한다 :

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

테스트 케이스 (상기 프로그램은 단지 제로 명령 행 인수 있었다면 value을 수정)! 나는 그것이'value = c << 8-i | 0 '그것은 그것과 0을 ORS하지만 그것은 8 번째 문자를 올바르게 지우지 않았던 것 같습니다. – mottese

1

8 비트 경계에서도 입력이 떨어지지 않는 상황을 고려하고 있습니까? 같은 문제가 기본 64 인코딩과 같은 일을 할 때 ....

관련 문제