Integer umwandeln in ein Array aus Chars



  • Hallo zusammen,
    ich würde gerne ein Integer in ein Array aus vier 8Bit-Datentypen umwandeln, also z.B. unsigned char.
    Wie könnte man sowas machen, ohne dass dabei Informationen verloren gehen und was mun man bei der Byte-Order beachten (ich arbeite an einem little Endian-System)

    Vielen Dank vorab.

    Gruss Christian



  • so z.B.

    uint32_t integer = 0x01020304, i;
    uint8_t ia[sizeof integer];
    memcpy(ia, &integer, sizeof integer); /* echte Kopie */
    
    for(i=0; i < sizeof integer; ++i)
      printf("ia[%d] = %d\n", i, ia[i]);
    

    Ausgabe:

    ia[0] = 4
    ia[1] = 3
    ia[2] = 2
    ia[3] = 1
    

    oder die einfachste Form:

    uint32_t integer = 0x01020304, i;
    uint8_t *ia = (uint8_t*) &integer; /* nur Zeiger auf integer */
    
    for(i=0; i < sizeof integer; ++i)
      printf("ia[%d] = %d\n", i, ia[i]);
    


  • Hallo

    Char in Integer geht nicht. Bzw. nur wenn der Integer <10 ist, würde das hier in etwa gehen:

    char intToChar(int integer)
    {
    return (char)integer+48;
    }
    

    Andererseits, falsch ich es nur falsch verstanden habe und du einen Char in einen Integer konvertieren möchtest, sollte atoi() gehen.

    way



  • way schrieb:

    Char in Integer geht nicht.

    geht wohl. machste einfach: char c=1; int i=c;

    way schrieb:

    ...und du einen Char in einen Integer konvertieren möchtest, sollte atoi() gehen.

    atoi will 'nen string haben. du müsstest erstmal aus dem char einen string machen, was ein sinnloser umweg wäre.
    🙂



  • columbus schrieb:

    Hallo zusammen,
    ich würde gerne ein Integer in ein Array aus vier 8Bit-Datentypen umwandeln, also z.B. unsigned char.

    Das hier liefert ein Little-Endian-Array, unabhängig von der Endianness des Systems (sinnvoll, wenn man portabel Binärdateien mit festgelegter Endianness schreiben will):

    uint32_t n = 12345;
    unsigned char array[] = { n & 0xff, n >> 8 & 0xff, n >> 16 & 0xff, n >> 24 & 0xff};
    

    Wenn du vorher einen signed integer hast und den zu uint32_t castest, bekommst du so auch die 2-Komplement-Darstellung.



  • edit: kann gelöscht werden



  • Hai!^°

    Beim Kopieren von Speichbereichen brauchst du dir keinen Kopp wegen der Bytereihenfolge zu machen, wenn du die Maschine nicht wexelst:

    int inum = 123, WOW = 0;  // Die Anzahl der Bytes von int ist hier beliebig.
    	char buf[sizeof inum]; // Puffer 
    	memcpy ( buf, &inum, sizeof buf ); // Inhalt von inum in den Puffer kopieren.
    	memcpy ( &WOW, buf, sizeof buf ); // Inhalt des Puffers nach WOW kopieren.
    	printf ( "%d", WOW ); // Der verlustfreie WOW-Effekt :)
    

Log in to reply