2016-03-19 3 views
2

Benötigen Sie Hilfe. Bis jetzt habe ich herausgefunden, wie man die binären Umwandlungen der eingegebenen Werte anzeigt, aber ich brauche einige Tipps, wie man diese Binärwerte zu einem Array hinzufügt, um tatsächlich mit den binären Werten arbeiten zu können. Ist es möglich, ein Array durch einen Switch Case zu füllen? Wie ich es im Fall '0' getan habe. Aus irgendeinem Grund, wenn ich den Wert von binären [i] zu drucken 0 zurück, statt 0000.Konvertieren von Werten in Binärwerte und Speichern in Arrays

int main() 
{ 

int i = 0; 
char hexstring[] = "24020004"; 
int binary[8]; 


while(hexstring[i]) 
{ 
    switch(hexstring[i]) 
    { 
     case '0': binary[i] = 0000; printf("%i", binary[i]); printf("0000"); break; 
     case '1': printf("0001"); break; 
     case '2': printf("0010"); break; 
     case '3': printf("0011"); break; 
     case '4': printf("0100"); break; 
     . 
     . 
     . 
     case 'f': printf("1111"); break; 
     default: printf("\nInvalid hexadecimal digit %c ", hexstring[i]); 
    } 
    i++; 
} 
return 0; 

}

+0

Whar abour 'Fall' 0 ': binär [i] = 0x0; Unterbrechung; Fall '1': binär [i] = 0x1; Unterbrechung; ...... Fall 'f': binär [i] = 0xf; Pause; '? –

+0

"..wenn ich den Wert von binary [i] drucke, gibt es 0 statt 0000 zurück" - binary [i] 'ist eine Zahl (speziell eine vorzeichenbehaftete ganze Zahl) und Zahlen haben keine führenden Nullen. Sie können erzwingen, dass 'printf' sie anzeigt:' printf ("% 04d", binary [i]); '. Aber das bedeutet nicht, dass sie im Wert selbst "gespeichert" sind. – usr2564301

Antwort

3

Wenn Sie binary[i] = 0000 schreiben Sie sagen, dass Sie Oktal konstant binary[i] zuweisen welches ist 0. Alle führenden Nullen sind weggelassen. Aber die erste Null gibt an, dass die Konstante als oktal interpretiert werden sollte. Ein anderes Beispiel: int x = 000011 bedeutet nur, dass x ein Oktalwert von 11 oder Dezimalwert von 9 zugewiesen ist. So versteht der Compiler Konstanten.

Wenn der Wert im Speicher gespeichert ist, weiß er nicht, aus welcher Basis er geschrieben wurde. Alle Zahlen werden in binärer Darstellung gespeichert, wie Sie wissen. Zahlen können jedoch viele Ansichten in verschiedenen Basen haben. Wir sind bequem mit Zahlen in dezimalAnsicht zu arbeiten.

Es gibt viele Spezifizierer für printf für integer zur Ausgabe einige seiner Darstellungen, sie sind %u - dezimal, %x - hex, %o - für Oktal. Leider keine Möglichkeit, eine Binärzahldarstellung auszugeben. Um die Zahl in base2 auszugeben, sollte man jede Binärziffer (0 oder 1) manuell berechnen und in der entsprechenden Reihenfolge ausdrucken.

Verwenden Sie den folgenden Code, um die Binärzahldarstellung auszugeben.

void printInBase2(int n) { 
    if(n == 0) { printf("0"); return; } 
    int b = 0; 
    for(b = 0; n >> b + 1; b++); 
    for(; b >= 0; b--) 
     printf("%c", (n >> b) % 2 + '0'); 
} 

Um eine Nummer aus einer hexadezimalen Darstellung gelesen, die in String gespeichert ist, können Sie dies tun:

unsigned int number; 
char hexstring[] = "24020004"; 
sscanf(hexstring, "%x", &number); 

Falls Sie Binärzahlen in int binary[] Array speichern möchten, dass Sie ähnlich, was Sie taten tun können mit String

case '0': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 0, binary[4 * i] = 0; break; 
case '1': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 0, binary[4 * i] = 1; break; 
case '2': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 1, binary[4 * i] = 0; break; 
... 
case 'f': binary[4 * i + 3] = 1, binary[4 * i + 2] = 1, binary[4 * i + 1] = 1, binary[4 * i] = 1; break; 

Auf diese Weise speichern Sie jede Binärziffer getrennt. Beachten Sie, dass Sie binary Array 4 mal länger als hexstring sein sollte.

+0

Es wird für den OP ziemlich schwierig sein, Ihren 'C++' Code in der mit 'C' gekennzeichneten Frage zu benutzen. –

+0

@David C. Rankin, danke für den Hinweis. Ich werde ein paar Änderungen vornehmen. –

+0

Nichtsdestotrotz vielen Dank für die bisherige Hilfe. habe viele Dinge aufgeklärt, die ich versucht habe zu tun. –

0

Je nachdem, wie genau Sie die einzelnen Hex-Werte halten/darstellen möchten, gibt es eine Reihe von Möglichkeiten. Sie können jeden Wert in binary[x] halten und Ihre gedruckte Ausgabe (z. B. "0010") erstellen, wenn Sie sich dem Problem genähert haben. Um auch eine Variable zu erstellen, die den korrekten numerischen Wert enthält, können Sie den Wert erstellen, indem Sie jeden Hex-Wert um einen geeigneten Betrag verschieben.Hier ist ein Ansatz:

#include <stdio.h> 

enum { NBYTES = 8, NBAD = 128 }; 

int main (int argc, char **argv) { 

    int i = 0, j = 0, n = 0; 
    char *hexstring = argc > 1 ? argv[1] : "24020004", 
     nothex[NBAD] = ""; 
    unsigned int binary[NBYTES] = {0}, 
       value = 0; 

    while (j < NBYTES && hexstring[i]) /* validate j to prevent overflow */ 
    { 
     char *fmt = j > 0 ? "-%s" : "\n%s"; 
     switch (hexstring[i]) 
     { 
      case '0': binary[j] = 0b0000; printf (fmt, "0000"); break; 
      case '1': binary[j] = 0b0001; printf (fmt, "0001"); break; 
      case '2': binary[j] = 0b0010; printf (fmt, "0010"); break; 
      case '3': binary[j] = 0b0011; printf (fmt, "0011"); break; 
      case '4': binary[j] = 0b0100; printf (fmt, "0100"); break; 
      case '5': binary[j] = 0b0101; printf (fmt, "0101"); break; 
      case '6': binary[j] = 0b0110; printf (fmt, "0110"); break; 
      case '7': binary[j] = 0b0111; printf (fmt, "0111"); break; 
      case '8': binary[j] = 0b1000; printf (fmt, "1000"); break; 
      case '9': binary[j] = 0b1001; printf (fmt, "1001"); break; 
      case 'a': binary[j] = 0b1010; printf (fmt, "1010"); break; 
      case 'b': binary[j] = 0b1011; printf (fmt, "1011"); break; 
      case 'c': binary[j] = 0b1100; printf (fmt, "1100"); break; 
      case 'd': binary[j] = 0b1101; printf (fmt, "1101"); break; 
      case 'e': binary[j] = 0b1110; printf (fmt, "1110"); break; 
      case 'f': binary[j] = 0b1111; printf (fmt, "1111"); break; 
      default: nothex[n] = hexstring[i]; 
        n += n < NBAD - 1; 
        goto badval; 
     } 
     /* value - holding numeric value */ 
     value += ('0' <= hexstring[i] && hexstring[i] <= '9') ? 
       (hexstring[i] - '0') << ((NBYTES - 1 - j) * sizeof value) : 
       (hexstring[i] - 'W') << ((NBYTES - 1 - j) * sizeof value); 
     j++; 
     badval: 
     i++; 
    } 
    printf ("\n value : 0x%08x (%u)\n\n", value, value); 
    for (i = 0; i < NBYTES; i++) 
     printf (" binary[%d] : 0x%x\n", i, binary[i]); 
    if (*nothex) { 
     printf ("\nwarning: invalid hexadecimal digit(s) in input.\n"); 
     for (i = 0; i < n; i++) printf (" %c", nothex[i]); 
    } 
    putchar ('\n'); 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/hex2bin 
0010-0100-0000-0010-0000-0000-0000-0100 
value : 0x24020004 (604110852) 

binary[0] : 0x2 
binary[1] : 0x4 
binary[2] : 0x0 
binary[3] : 0x2 
binary[4] : 0x0 
binary[5] : 0x0 
binary[6] : 0x0 
binary[7] : 0x4 

$ ./bin/hex2bin "cafebabe" 
1100-1010-1111-1110-1011-1010-1011-1110 
value : 0xcafebabe (3405691582) 

binary[0] : 0xc 
binary[1] : 0xa 
binary[2] : 0xf 
binary[3] : 0xe 
binary[4] : 0xb 
binary[5] : 0xa 
binary[6] : 0xb 
binary[7] : 0xe 

$ ./bin/hex2bin "hi-cafe-babe-up" 

1100-1010-1111-1110-1011-1010-1011-1110 
value : 0xcafebabe (3405691582) 

binary[0] : 0xc 
binary[1] : 0xa 
binary[2] : 0xf 
binary[3] : 0xe 
binary[4] : 0xb 
binary[5] : 0xa 
binary[6] : 0xb 
binary[7] : 0xe 

warning: invalid hexadecimal digit(s) in input. 
h i - - 

schauen Sie vorbei und lassen Sie mich wissen, ob dies ist, was Sie sich vorgestellt hatte.