2009-11-05 13 views
7

Estoy tratando de convertir simplemente un byte recibido de fget en binario.Bytes a binario en C

sé el valor del primer byte se basa en la impresión 49 del valor. Ahora necesito convertir esto en su valor binario.

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]); 
} 

Esto imprimirá:

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

Claramente, esto no es un valor binario. ¿Alguna ayuda?

Respuesta

16

El problema que tiene es que su asignación no está resultando en un valor verdadero o falso.

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

Esto obtiene el valor del bit. Es necesario para ver si el bit está activado o desactivado, así:

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

Una forma, entre muchas:

#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

Cambio

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

a

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

o

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

o

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

Usted puede notar que su salida tiene un par 1 y 0, sino también las potencias de 2, como 32. Esto es porque después de aislar el bit que desee utilizando la máscara, usted todavía tiene que poco de cambio que en el dígito menos significativo de manera que se muestra como un 1. O bien, podría utilizar lo que otros puestos propuesto, y en lugar de desplazamiento de bits del resultado (algo así como 00001000, por ejemplo), puede simplemente utilizar (como resultado! = 0) para obtener un 1 o 0, ya que en C, falso es 0, y las comparaciones como! = devolverán 1 como verdadero (creo).

-1

Esta adición en lugar de que funcionará:

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(""); 
}