2016-04-10 4 views
-4

Ich habe str:C - Char Hexa

char *str = "lala"; 

Jetzt möchte ich alle Zeichen in str in hexadezimal, zB wie konvertieren:

str = convert(str); 
print str: 0x6C 0x61 0x6C 0x61 
      ^l^a^l^a 

Wie kann ich das tun?

Antwort

-2
char* x = str - 1; 
while(*++x) printf("%02x ", (int) *x); // Print one character in hex 
printf("\n") // Finish with a carriage return 
+1

Dieser Code hat Verhalten undefiniert. Die Zeigerarithmetik ist nur innerhalb eines Arrays gültig (einschließlich des "one-over-the-end" -Zeigers). (Andererseits möchte ich, dass die Leute aufhören, inkrementelle Teilausdrücke zu verwenden, nur um zu zeigen, dass sie "C wissen".) –

+0

Könnte 'char * x = str; while (* x) printf ("% 02hhx", * x ++); 'und vermeide die anfängliche' str - 1'. '(int)' dienen keinem Zweck. – chux

+0

@KerrekSB In der Frage zeigt 'str' auf ein Zeichenfeld. In meiner Antwort iteriert "x" über dieses Array, ohne "str" ​​zu ändern. 'x' wird zu keiner Zeit dereferenziert, wenn es außerhalb der Grenzen von' str' liegt. – Logicrat

2
char *convert(char const *str) { 
    int len = strlen(str); 
    char *retVal = (char *)malloc(5 * len); 
    char *pos = retVal; 
    int i; 
    for(i = 0; i < len; ++i, pos += 5) sprintf(pos, i? " 0x%x" : "0x%x", str[i]); 
    retVal[5 * len - 1] = '\0'; 
    return retVal; 
} 

hätte etwas verpasst haben nicht C seit acht Jahren verwendet.

2

einfach durch printf zu fragen, es zu tun:

void convert(char* str, size_t length) { 
    size_t i; 
    for(i = 0; i < length; i++) 
     printf("0x%02x ", str[i]); 
} 
0

Sie können es erreichen, indem diese Implementierung mit ....

#define MAX 100 

char *convert(char *str) 
{ 
    char *hexStr = (char *)malloc(strnlen(str, MAX) * 5); 
    if (hexStr == NULL) 
     return NULL; 
    int i,j; 

    for (i=0, j=0; str[i]; j+=5, i++) 
     sprintf(hexStr + j, "0x%02x ", str[i]); 

    hexStr[--j] = '\0'; 

    return hexStr; 
} 
+0

Buffer Overflow Potential: 'sprintf()' schreibt '0xNN \ 0', wenn also die Länge 2 ist, dann werden 10 Bytes zugewiesen, aber es wird' 0xNN 0xNN \ 0' (11 Bytes) geschrieben. Anders als das, schön gemacht :) –

+0

die for-Schleife würde kein Nullzeichen in den Puffer schreiben. Die Anweisung hexStr [- j] = '\ 0'; schreibe Nullzeichen beim letzten Leerzeichen. Daher sollte kein Pufferüberlauf auftreten. – abhiarora

+1

Die Funktion 'sprintf()' schreibt immer ein Nullzeichen. Vom C-Standard: _Die 'sprintf'-Funktion ist äquivalent zu' fprintf', außer dass die Ausgabe in ein Array geschrieben wird (spezifiziert durch die Argumente) und nicht in einen Stream. Ein Nullzeichen wird am Ende der geschriebenen Zeichen geschrieben; ..._ Wenn Sie also 5 Zeichen mit 'sprintf()' in den Puffer schreiben, schreiben Sie am Ende ein 6. Zeichen: das Nullzeichen. –