2016-10-09 2 views
1

Я пытаюсь декодировать двоичный код, который был закодирован (самый старший байт первым) со следующим циклом.Декодировать биты в C

int ch; // Has a value of, for example, 97 (which evaluates to 'a' with putchar(ch)) 
for (int i = 0; i < CHAR_BIT; i++) { 
    printf("%d", !!((ch << i) & 0x80)); 
} 

До сих пор я пытался:

unsigned int byte[CHAR_BIT]; // Filled elsewhere 
unsigned char result = 0; 
for (int i = 0; i < CHAR_BIT; i++) { 
    result |= (byte[i] == '1') << ((CHAR_BIT - 1) - i); 
} 
putchar(result); 

Но выход не так, что кажется, будто персонажи были сдвинуты неправильное количество. Предполагая, что первый блок кода находится в файле prog1, а второй - в prog2, вывод этой команды оболочки должен быть abc, но это `bb (буквальный обратный тик, за которым следует bb).

echo "abc" | ./prog1 | ./prog2 
+1

Когда вы говорите, что «выход неправильный», вы можете указать, какой вход/выход и что вы ожидаете –

+0

@BenWainwright Посмотреть мое обновление – Tim

+0

Вы пишете код, который кодирует символ, или это было вам дано? –

ответ

2

Это работает для меня:

prog1.c

#include <stdio.h> 

#define CHAR_BIT 8 

void encode(int c) { 
    for (int i = 0; i < CHAR_BIT; i++) { 
     printf("%d", !!((c << i) & 0x80)); 
    } 
} 

int main() { 
    int c; 

    while ((c = getchar()) != EOF) { 
     encode(c); 
    } 

    printf("\n"); 

    return 0; 
} 

prog2.c

#include <stdio.h> 
#include <string.h> 

#define CHAR_BIT 8 

void decode(char *byte) { 
    int c = 0; 

    for (int i = 0; i < CHAR_BIT; i++) { 
     c |= (byte[i] == '1') << ((CHAR_BIT - 1) - i); 
    } 

    putchar(c); 
} 

int main() { 
    char byte[CHAR_BIT + 1]; 

    while (scanf("%8s", byte) == 1) { 
     decode(byte); 
    } 

    return 0; 
} 

Пример

> echo "abc" | ./prog1 
01100001011000100110001100001010 
> echo "abc" | ./prog1 | ./prog2 
abc 
> 

Если логика кодирования/декодирования такая же, как у вас, то эта линия находится под подозрением:

unsigned int byte[CHAR_BIT]; // Filled elsewhere 

и зная, что произошло в другом месте могли бы помочь объяснить, что пошло не так.

Смежные вопросы