Hex in char-array in C
Gegeben einen string von hex-Werten , d.h. z.B. "0011223344" ist also, 0x00, 0x11, etc.
Wie füge ich diese Werte in ein char-array?
Äquivalent zu sagen:
char array[4] = { 0x00, 0x11 ... };
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht fit 5 Byte im Wert von Daten in einen 4-byte-array zu verwenden; das führt zu Pufferüberläufen.
Wenn du die hex-Ziffern in der Zeichenfolge, die Sie verwenden können
sscanf()
und einer Schleife:Beachten Sie, dass drucken die Zeichenfolge beginnend mit einem null-byte erfordert Sorgfalt; die meisten Operationen beendet, auf den ersten null-byte. Beachten Sie, dass dieser code nicht auf null beendet den Puffer; es ist nicht klar, ob die null-Terminierung ist wünschenswert, und es ist nicht genug Platz im Puffer, die ich erklärte, fügen Sie ein terminal-null (aber das ist leicht behoben). Es gibt eine gute chance, dass, wenn der code war verpackt wie ein Unterprogramm, würde es brauchen, um wieder die Länge der konvertierten Zeichenkette (obwohl Sie könnten auch argumentieren, es ist die Länge der Quell-Zeichenkette, geteilt durch zwei).
Ich würde so etwas tun;
Wenn die Zeichenfolge korrekt ist und keine Notwendigkeit zu halten, deren Inhalt dann würde ich es so machen:
EDIT 1: sorry, ich habe vergessen zu berechnen, die mit den Buchstaben A-F (a-f)
EDIT 2: ich habe versucht zu schreiben, eine mehr pedantisch-code:
Testen:
Ergebnis:
char array[] = {0, 17, 34, 51, 68};
. Aber ich denke, wenn der Fragesteller sagte: "also", er meinte eigentlich das "z.B."War ich auf der Suche für die gleiche Sache, und nach der Lektüre eine Menge, schließlich erzeugt diese Funktion. Dachte, es könnte helfen, jemand
Sagen wir: dies ist ein little-endian-Format ascii-Plattform.
Vielleicht ist der OP gemeint "array von char" anstatt "string"..
Wir arbeiten mit Paaren von char-und bit-Maskierung.. Hinweis shiftyness von x16..
und die Funktion encode() ist definiert...
Dieser Ansatz schwimmt herum anderswo, es ist nicht meine ursprüngliche Arbeit, aber es ist alt.
Nicht gefallen den Puristen, denn es ist nicht tragbar, aber die Erweiterung wäre trivial.
hex(0x30,0x57,0x37)
dass Extraktion?Fatalfloor...
Gibt es ein paar Möglichkeiten, dies zu tun... die erste, die Sie verwenden können, memcpy() kopieren Sie die genauen Darstellung in der char-array.
Können Sie verwenden, bit-Verschiebung und bit-Maskierung Techniken als gut. Ich vermute, dies ist, was Sie tun müssen, ist, wie es klingt wie ein Hausaufgaben problem.
Schließlich können Sie einige Phantasie-Zeiger-Dereferenzierung, um kopieren Sie die memory location, die Sie benötigen.
Alle diese Methoden sind detailliert hier:
Speichern eines int in ein char-array?
Geben eine beste Weg:
Hex-string in numerischen Wert , d.h. str[] = "0011223344" Wert 0x0011223344, verwenden Sie
getan. wenn nötig, entfernen Sie Anfang 0x00, siehe unten.
obwohl für LITTLE_ENDIAN Plattformen, plus:
Hex-Wert zu char-array, Wert 0x11223344 char arr[N] = {0x00, 0x11, ...}
getan.
Hinweise:
Für die Umwandlung der langen Schnur auf einem 64 bit hex char arr auf einem 32-bit-system, die Sie verwenden sollten, unsigned long long statt unsigned long, und htonl ist nicht genug, so tun Sie es sich, wie unten, da kann es keine htonll, htonq oder hton64 etc:
sehen http://effocore.googlecode.com/svn/trunk/devel/effo/codebase/builtin/include/impl/sys/bswap.h
Den besten Weg den ich kenne:
Gibt die Funktion die Anzahl der umgewandelten bytes, die gespeichert dest_buffer.
Der input-string kann keine Leerzeichen enthalten und gemischter groß-und Kleinschreibung.
"01 02 03 04 ab Cd eF Müll AB"
übersetzt dest_buffer mit
01 02 03 04 ab cd ef
und auch
"01020304abCdeFgarbageAB"
übersetzt vor.
Analyse Stoppt beim ersten "Fehler" (nicht hex, nicht Platz).
Hinweis: auch dies ist eine gültige Zeichenfolge:
"01 2 03 04 ab Cd eF Müll AB"
und produziert:
01 02 03 04 ab cd ef
Zuerst, Ihre Frage ist nicht sehr präzise. Ist der string eine
std::string
oder einechar
Puffer? Festgelegt zur compile-Zeit?Dynamic memory ist sicherlich Ihre Antwort.
Dann können Sie gehen durch den Eingang und weisen Sie es auf die array.