Question

Je suis en train de convertir simplement un octet reçu de fget en binaire.

Je sais que la valeur du premier octet 49 a été basé sur l'impression de la valeur. Je dois maintenant convertir en sa valeur binaire.

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

Cette impression volonté:

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

De toute évidence, ce n'est pas une valeur binaire. Toute aide?

Était-ce utile?

La solution

Le problème que vous rencontrez est que votre mission ne se traduit pas en une valeur vraie ou fausse.

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

obtient la valeur du bit. Vous devez voir si le bit est activé ou non, comme ceci:

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

Autres conseils

Modifier

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

à

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

ou

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

ou

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

Une façon, parmi d'autres:

#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;
}

Vous remarquerez peut-être que votre sortie a un couple 1 et 0, mais aussi des puissances de 2, tels que 32. En effet, une fois que vous isoler le bit que vous voulez utiliser le masque, il vous reste à peu décaler dans le moins significatif chiffres de sorte qu'il apparaît comme 1. Ou vous pouvez utiliser ce que d'autres postes suggéré, et au lieu de (quelque chose comme 00.001.000 par exemple) bit-décalage du résultat, vous pouvez simplement utiliser (résultat = 0) chercher soit 1 ou 0, car en C, est fausse 0, et les comparaisons telles que! = retour 1 vrai (je pense).

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

Cet ajout à la place de qui fonctionnera:

bits[i]= byte & (mask << i); 
bits[i] >>=i;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top