2016-05-07 10 views
-1

Nach this Frage Auschecken ich nicht erforderlich Lösung gefunden, also habe ich versucht strtol in folgender Weise zu verwenden:strtol Ergebnis Mismatch während String-Konvertierung

in = (unsigned char *)malloc(16); 

for(size_t i = 0; i < (size_t)strlen(argv[2])/2; i+=2) 
{ 
    long tmp = 0; 
    tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16); 
    memcpy(&in[i], &tmp, 1); 
} 

Dieser Code mehrere Zwischenwerte erzeugt:

Watches of local variables

Kann jemand bitte erklären Sie mir, warum ganze in Array von 0xFF (255) Bytes gefüllt wird und warum tmp nicht gleich es ist geschätzter Wert?

Tipps zur Verbesserung des obigen Codes zum Füllen in Array mit korrekten Hex-Werten auch willkommen.

+0

Sie müssen lesen [ask] – Amit

+1

Befreien Sie sich von den Güssen. '(unsigned char *)' ist unnötig. '(size_t)' ist unnötig, da der Rückgabetyp von 'strlen()' bereits 'size_t' ist. Und '(const char *) argv [2] + i, & argv [2] + 2 'ist einfach falsch. – cremno

+0

Das zweite Argument für 'strtol' ist ziemlich falsch - nichts mit der Eingabezeichenfolge zu tun. Und ich schlage vor, dass deine Schleife "strlen" (...) 'not' strlen (...)/2', wenn Sie versuchen, die Eingabe mehrmals zu konvertieren, indem Sie das erste Paar, das nächste Paar usw. von Hexadezimalziffern überspringen. –

Antwort

1

Ihr Code fehlerhaft ist für Mehrfachzählungen und die Modelle verstecken die Probleme:

Casting der Rückgabewert von malloc in C nicht erforderlich ist, und kann potenziell eine unsichere Umwandlung verstecken, wenn Sie vergessen <stdlib.h> enthalten:

in = (unsigned char *)malloc(16); 

den Rückgabewert von strlen zu (size_t) Casting ist nutzlos, auch als redundantes strlen eine size_t zurückzukehren definiert. Auch hier könnten Sie <string.h> ...

for (size_t i = 0; i < (size_t)strlen(argv[2])/2; i += 2) { 
    long tmp = 0; 

strtol nimmt einen const Zeiger auf char, schließen vergessen, welche argv[2] + i implizit konvertiert werden. Die Besetzung (const char*) ist nutzlos. Das zweite Argument ist die Adresse eines char*. Sie übergeben die Adresse des fünften Elements von argv, in anderen Worten &argv[4], ganz sicher nicht das, was Sie tun einrücken, obwohl Zweck der Schleife ist ganz dunkel ist ...

tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16); 

Kopieren des Long-Wert in tmp mit memcpy würde erfordern, sizeof(tmp) Bytes zu kopieren. Kopieren des ersten Byte nur eine Implementierung definiert Wirkung hat, abhängig von der Größe der char und die Endian des Zielsystems:

memcpy(&in[i], &tmp, 1); 
} 

Sie sollten eine komplette übersetzbar Beispiel posten, die Ihr Problem veranschaulicht, ist ein Codefragment fehlende wichtige Kontextinformationen, z. B. welche Headerdateien enthalten sind, wie Variablen definiert sind und welcher Code vor dem Fragment ausgeführt wird.

Wie geschrieben, macht Ihr Code nicht viel Sinn, versuchen, sein Verhalten zu interpretieren, ist sinnlos.

In Bezug auf die Frage in Bezug, bietet Ihr Code nicht einmal entfernt eine Lösung zum Konvertieren einer Zeichenfolge von hexadezimalen Zeichen in ein Array von Bytes.