2017-01-22 8 views
-1

wenn ich den folgenden C-Array:C hex Zeichenfeld zu Stringdarstellung

char arr[4]; 
arr[0] = 0x11; 
arr[1] = 0xc0; 
arr[2] = 0x0c; 
arr[3] = 0x00; 

Wie die obigen Daten in einen String umgewandelt werden, wie weiter unten?

char* str = "11c00c00"; 

Antwort

1
int main() 
{ 
    char arr[4]; 
    arr[0] = 0x11; 
    arr[1] = 0xc0; 
    arr[2] = 0x0c; 
    arr[3] = 0x00; 

    size_t len = sizeof(arr)/sizeof(*arr); 

    char* str = (char*)malloc(len * 2 + 1); 
    for (size_t i = 0; i < len; i++) 
    { 
     const static char table[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c','d','e','f' }; 

     unsigned char c = (unsigned char)(arr[i]); 
     unsigned int lowbyte = c & 0x0f; 
     unsigned int highbyte = (c >> 4) & 0x0f; 

     str[2 * i] = table[highbyte]; 
     str[2 * i + 1] = table[lowbyte]; 
    } 

    str[2 * len] = '\0'; 

    printf("%s\n",str); 

    return 0; 
} 
+0

Ich versuche, den Code zu verstehen. Können Sie bitte erklären, warum Sie 'c & 0x0f' und' (c >> 4) & 0x0f' getan haben? Vielen Dank. – Jake

+1

'c & 0x0F' ist" berechne die unteren 4 Bits des Bytewerts, der durch c dargestellt wird ". Das ergibt einen Wert zwischen 0-15. Ähnlich ist "(c >> 4) & 0x0f" "berechne die oberen 4 Bits von c". Google für "c bitmask tutorial" und "c bitshift tutorial". Viele gute Seiten, um dieses Zeug zu erklären. – selbie

0

Konvertieren jedes Zeichen zu einem unsigned Zeichen (so die 0xC0 nicht negativ ist), wandelt es dann in eine ganzen Zahl und Ausgabe als ein zweistelligen hexadezimalen Wert.

#include <stdlib.h> 
#include <stdio.h> 


#define INT(x) ((int)(unsigned char)(x)) 

int main() 
{ 
    char arr[4]; 
    arr[0] = 0x11; 
    arr[1] = 0xc0; 
    arr[2] = 0x0c; 
    arr[3] = 0x00; 

    char *str; 

    str=malloc(32); 
    sprintf(str, "%02x%02x%02x%02x", 
     INT(arr[0]), INT(arr[1]), INT(arr[2]), INT(arr[3])); 

    puts(str); 
} 

Ausgang ist:

11c00c00