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.
Sie müssen lesen [ask] – Amit
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
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. –