Ich habe:
uint8 buf[] = {0, 1, 10, 11};
Ich möchte das Byte-Array in eine Zeichenfolge konvertieren, damit ich die Zeichenfolge mit printf drucken kann:
printf("%s\n", str);
und bekommen (die Doppelpunkte sind nicht notwendig):
"00:01:0A:0B"
Jede Hilfe wäre sehr dankbar.
buf[i]
muss gegossen werdenunsigned char
, oder es wird überlaufen, wennbuf[i] > 127
das heißt:buf_ptr += sprintf(buf_ptr, "%02X", (unsigned char)buf[i]);
Antworten:
für einen allgemeineren Weg:
Um sich mit einer Zeichenfolge zu verketten, gibt es einige Möglichkeiten, wie Sie dies tun können ... Ich würde wahrscheinlich einen Zeiger auf das Ende der Zeichenfolge behalten und sprintf verwenden. Sie sollten auch die Größe des Arrays verfolgen, um sicherzustellen, dass es nicht größer als der zugewiesene Speicherplatz wird:
quelle
printf("%02X", (unsigned char)buf[i]);
sollte verwendet werden, da das Original einen Überlauf für nicht signierte Zeichen verursachtprintf("%02hhX", buf[i])
?Zum Abschluss können Sie dies auch problemlos tun, ohne eine umfangreiche Bibliotheksfunktion aufzurufen (kein snprintf, kein strcat, nicht einmal memcpy). Dies kann beispielsweise nützlich sein, wenn Sie einen Mikrocontroller oder einen Betriebssystemkern programmieren, für den libc nicht verfügbar ist.
Nichts Besonderes, Sie können ähnlichen Code finden, wenn Sie danach googeln. Wirklich, es ist nicht viel komplizierter als snprintf aufzurufen und viel schneller.
Hier ist eine weitere etwas kürzere Version. Es wird lediglich die Zwischenindexvariable i und das Duplizieren des letzten Fallcodes vermieden (das abschließende Zeichen wird jedoch zweimal geschrieben).
Unten finden Sie eine weitere Version, um auf einen Kommentar zu antworten, der besagt, dass ich einen "Trick" verwendet habe, um die Größe des Eingabepuffers zu ermitteln. Eigentlich ist es kein Trick, sondern ein notwendiges Eingabewissen (Sie müssen die Größe der Daten kennen, die Sie konvertieren). Ich habe dies klarer gemacht, indem ich den Konvertierungscode in eine separate Funktion extrahiert habe. Ich habe auch einen Grenzprüfcode für den Zielpuffer hinzugefügt, der nicht wirklich notwendig ist, wenn wir wissen, was wir tun.
quelle
in
und Ausgabepufferout
? Ich könnte mich auch dafür entscheiden, einen String zu verwenden und eine Kopie zurückzugeben, anstatt einen Ausgabepuffer bereitzustellen. In modernen C ++ - Optimierern sind sie gut genug, um sich nicht darum zu kümmern.Hier ist eine Methode, die viel schneller ist:
quelle
ca9e3c972f1c5db40c0b4a66ab5bc1a20ca4457bdbe5e0f8925896d5ed37d726
und Sie werden aussteigenÌaÌe3cÌ72f1c5dÌ40c0b4a66Ìb5bÌ1Ì20cÌ4457bÌbÌ5Ì0Ì8Ì258Ì6Ì5Ìd37Ì726
. Um dies zu beheben, muss das Bithex_str
in der ersten Zeile der for-Schleife(input[i] >> 4) & 0x0F
wie in der Antwort von @ kriss geändert werden . Dann funktioniert es gut.Ähnliche Antworten gibt es bereits oben. Ich habe diese hinzugefügt, um zu erklären, wie die folgende Codezeile genau funktioniert:
Es ist ziemlich knifflig und nicht leicht zu verstehen. Ich habe die Erklärung in den Kommentaren unten angegeben:
quelle
Ich wollte nur Folgendes hinzufügen, auch wenn es etwas vom Thema abweicht (nicht Standard C), aber ich suche oft danach und stoße bei den ersten Suchtreffern auf diese Frage. Die Linux-Kernel-Druckfunktion
printk
verfügt auch über Formatspezifizierer für die Ausgabe von Array- / Speicherinhalten "direkt" über einen einzelnen Formatspezifizierer:https://www.kernel.org/doc/Documentation/printk-formats.txt
... diese Formatspezifizierer scheinen jedoch für den Standardbenutzerraum nicht zu existieren
(s)printf
.quelle
Lösung
Die Funktion
btox
konvertiert beliebige Daten*bb
in eine nicht abgeschlossene Folge*xp
vonn
hexadezimalen Ziffern:Beispiel
Ergebnis :
00010A0B
.Live: Tio.run .
quelle
Dies ist eine Möglichkeit, die Konvertierung durchzuführen:
quelle
Leicht modifizierte Yannith-Version. Es ist nur so, dass ich es gerne als Rückgabewert habe
quelle
Diese Funktion eignet sich, wenn Benutzer / Aufrufer möchten, dass Hex-Zeichenfolgen in ein Zeichenarray / -puffer eingefügt werden. Mit einer Hex-Zeichenfolge in einem Zeichenpuffer kann der Benutzer / Aufrufer ein eigenes Makro / eine eigene Funktion verwenden, um sie an einem beliebigen Ort anzuzeigen oder zu protokollieren (z. B. in einer Datei). Mit dieser Funktion kann der Aufrufer auch die Anzahl der (Hex-) Bytes steuern, die in jede Zeile eingefügt werden sollen.
Beispiel: Code
AUSGABE
quelle
In C gibt es dafür kein Grundelement. Ich würde wahrscheinlich einen ausreichend langen Puffer zuordnen (oder vielleicht zuordnen) und die Eingabe durchlaufen. Ich habe es auch mit einer dynamischen String-Bibliothek mit Semantik (aber nicht Syntax!) Ähnlich wie bei C ++ gesehen. Dies
ostringstream
ist eine plausibel allgemeinere Lösung, aber die zusätzliche Komplexität ist möglicherweise nicht nur für einen Einzelfall wert.quelle
Wenn Sie die Hex-Werte in einer
char *
Zeichenfolge speichern möchten , können Sie verwendensnprintf
. Sie müssen Platz für alle gedruckten Zeichen zuweisen, einschließlich der führenden Nullen und des Doppelpunkts.Erweitern Sie Marks Antwort:
Also wird jetzt
str_buf
die Hex-Zeichenfolge enthalten.quelle
Die Lösung von ZincX wurde angepasst, um Doppelpunktbegrenzer einzuschließen:
quelle
Ich werde hier die C ++ - Version für alle Interessierten hinzufügen .
Es wird der Hexdump der
buffer
Längecount
bis gedrucktstd::ostream
out
(Sie können ihn als Standard festlegenstd::cout
). Jede Zeile enthältbytes_per_line
Bytes, jedes Byte wird mit einem zweistelligen Hex in Großbuchstaben dargestellt. Zwischen den Bytes wird ein Leerzeichen stehen. Und am Ende der Zeile oder am Ende des Puffers wird eine neue Zeile gedruckt. Wennbytes_per_line
auf 0 gesetzt, wird new_line nicht gedruckt. Versuchen Sie es selbst.quelle
Zur einfachen Verwendung habe ich eine Funktion erstellt, die die Eingabezeichenfolge (Binärdaten) codiert:
Verwendung:
quelle
Basierend auf Yannuths Antwort, aber vereinfacht.
Hier
dest[]
wird impliziert, dass die Länge von doppelt solen
groß ist, und die Zuweisung wird vom Anrufer verwaltet.quelle
Ich weiß, dass diese Frage bereits eine Antwort hat, aber ich denke, meine Lösung könnte jemandem helfen.
In meinem Fall hatte ich also ein Byte-Array, das den Schlüssel darstellt, und ich musste dieses Byte-Array in ein char-Array mit hexadezimalen Werten konvertieren, um es in einer Zeile auszudrucken. Ich habe meinen Code in eine Funktion wie diese extrahiert:
Jetzt kann ich meine Funktion folgendermaßen nutzen:
Serial
object ist Teil der Arduino-Bibliothek undm_publicKey
Mitglied meiner Klasse mit der folgenden Deklarationuint8_t m_publicKey[32]
.quelle
Sie können mit snprintf und malloc lösen.
OUT: bbccdd0fef0f0e0d0c
quelle
Was für komplexe Lösungen!
Malloc und Sprints und Casts oh mein Gott. (OZ Zitat)
und nirgendwo ein Rem. Meine Güte,
wie wäre es mit so etwas?
quelle