Frage

Ich versuche einfach ein Byte zu konvertieren, der von FGet in Binärer erhalten wurde.

Ich weiß, dass der Wert des ersten Byte 49 betrug, basierend auf dem Drucken des Wertes. Ich muss dies jetzt in seinen binären Wert umwandeln.

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

Dies wird ausdrucken:

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

Dies ist eindeutig kein binärer Wert. Irgendeine Hilfe?

War es hilfreich?

Lösung

Das Problem, das Sie haben, ist, dass Ihre Aufgabe nicht zu einem wahren oder falschen Wert führt.

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

Dies erhält den Wert des Bits. Sie müssen sehen, ob das Bit ein- oder ausgeschaltet ist, wie folgt:

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

Andere Tipps

Veränderung

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

zu

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

oder

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

oder

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

Ein Weg unter vielen:

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

Sie können feststellen, dass Ihre Ausgabe ein paar 1 und 0 enthält, aber auch Kräfte von 2, z. B. 32. Dies liegt daran Ziffern Sie so, dass es als 1. oder Sie können das verwenden, was andere Beiträge vorgeschlagen haben, und anstatt das Ergebnis zu verändern (beispielsweise 00001000), können Sie einfach (Ergebnis! = 0) verwenden, um entweder eine 1 zu holen oder 0, da in C, falsch ist, ist 0 und Vergleiche wie! = werden 1 als wahr zurückgeben (glaube ich).

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

Diese Ergänzung anstelle davon wird funktionieren:

bits[i]= byte & (mask << i); 
bits[i] >>=i;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top