2009-11-05 13 views
7

Próbuję po prostu przekonwertować bajt otrzymany z fget na binarny.Bajty na binarne w C

Wiem, że wartość pierwszego bajtu wynosiła 49 na podstawie drukowania wartości. Teraz muszę przekonwertować to na jego wartość binarną.

unsigned char byte = 49;// Read from file 
unsigned char mask = 1; // Bit mask 
unsigned char bits[8]; 

    // Extract the bits 
for (int i = 0; i < 8; i++) { 
    // Mask each bit in the byte and store it 
    bits[i] = byte & (mask << i); 
} 
// For debug purposes, lets print the received data 
for (int i = 0; i < 8; i++) { 
printf("Bit: %d\n",bits[i]); 
} 

ten wypisze:

Bit: 1 
Bit: 0 
Bit: 0 
Bit: 0 
Bit: 16 
Bit: 32 
Bit: 0 
Bit: 0 
Press any key to continue . . . 

Oczywiście, nie jest to wartość binarna. Jakaś pomoc?

Odpowiedz

16

Problem masz jest to, że zadanie nie jest w wyniku czego wartość prawdziwą lub fałszywą.

bits[i] = byte & (mask << i); 

Otrzymuje wartość bitu. Trzeba sprawdzić, czy bit jest włączony lub wyłączony, podobnie jak to:

bits[i] = (byte & (mask << i)) != 0; 
4

Jednym ze sposobów, wśród wielu:

#include <stdio.h> 
#include <limits.h> 

int main(void) { 
    int i; 
    char bits[CHAR_BIT + 1]; 
    unsigned char value = 47; 

    for (i = CHAR_BIT - 1; i >= 0; i -= 1) { 
     bits[i] = '0' + (value & 0x01); 
     value >>= 1; 
    } 

    bits[CHAR_BIT] = 0; 

    puts(bits); 

    return 0; 
} 
5

Zmień

bits[i] = byte & (mask << i); 

do

bits[i] = (byte >> i) & mask; 

lub

bits[i] = (byte >> i) & 1; 

lub

bits[i] = byte & 1; 
byte >>= 1; 
1

Możesz zauważyć, że twoje wyjście ma parę 1 i 0, ale także moc 2, na przykład 32. Dzieje się tak dlatego, że po wyizolowaniu bitów, które chcesz użyć maski, nadal musisz nieco przesunąć to do najmniej znaczącej cyfry, aby pojawiła się jako 1. Lub możesz użyć innych sugerowanych postów, a zamiast przesunięcia bitowego wyniku (np. 00001000), możesz po prostu użyć (wynik! = 0) aby pobrać albo 1 albo 0, ponieważ w C, fałsz wynosi 0, a porównania takie jak! = zwrócą 1 jako prawdziwe (myślę).

-1

Ten dodatek w miejscu, które będzie działać:

bits[i]= byte & (mask << i); 
bits[i] >>=i; 
0
#include<Stdio.h> 
#include <limits.h> 
void main(void) { 
    unsigned char byte = 49;// Read from file 
    unsigned char mask = 1; // Bit mask 
    unsigned char bits[8]; 
    int i, j = CHAR_BIT-1; 
      // Extract the bits 
    for (i = 0; i < 8; i++,j--,mask = 1) { 
    // Mask each bit in the byte and store it 
    bits[i] =(byte & (mask<<=j)) != NULL; 
    } 
    // For debug purposes, lets print the received data 
    for (int i = 0; i < 8; i++) { 
     printf("%d", bits[i]); 
    } 
    puts(""); 
}