2008-08-27 12 views
13

Ich arbeite viel mit Netzwerk- und serieller Kommunikationssoftware, daher ist es oft notwendig für mich Code zu haben, um hex Dumps von Datenpaketen anzuzeigen oder zu protokollieren.Standard C++ Hex Dump Code

Jedes Mal, wenn ich dies tue, schreibe ich eine weitere Hex-Dump-Routine von Grund auf neu. Ich bin dabei, es wieder zu tun, aber ich dachte, ich würde hier fragen: Gibt es irgendeinen guten kostenlosen Hex-Dump-Code für C++ da draußen?

Eigenschaften Ich möchte:

  • N Bytes pro Zeile
  • optional ASCII/UTF8-Dump neben dem hex
  • konfigurierbaren Einzug, pro-line-Präfixe (wobei N irgendwie konfigurierbar), pro -Linie Suffixe usw.
  • minimale Abhängigkeiten (im Idealfall würde ich mag den Code für alle in einer Header-Datei sein, oder ein Ausschnitt sein, die ich in nur einfügen können)

Edit: Klarstellung: Ich bin auf der Suche nach Code, den ich problemlos in meine eigenen Programme in stderr, stdout, Log-Dateien oder andere solche Ausgabeströme schreiben können. Ich bin nicht auf der Suche nach einem Befehlszeilen-Hex-Dump-Dienstprogramm.

Antwort

6

Das Unix-Tool xxd verteilt als Teil vim und nach http://www.vmunix.com/vim/util.html#xxd, die Quelle für xxd ist ftp://ftp.uni-erlangen.de:21/pub/utilities/etc/xxd-1.10.tar.gz lösen sollte. Es wurde in C geschrieben und ist ungefähr 721 Zeilen. Die einzigen Lizenzinformationen für es wird angegeben:

* Distribute freely and credit me, 
* make money and share with me, 
* lose money and don't ask me. 

Das Unix-Tool hexdump von http://gd.tuwien.ac.at/softeng/Aegis/hexdump.html zur Verfügung steht. Es wurde in C geschrieben und kann aus der Quelle kompiliert werden. Es ist ein bisschen größer als xxd und wird unter der GPL vertrieben.

1

Können Sie Ihre own dissector für Wireshark schreiben?

Edit: geschrieben, bevor die Präzision in der Frage

1

Ich habe PSPad als Hex-Editor verwendet gesehen, aber ich habe in der Regel das gleiche, was Sie tun. Ich bin überrascht, dass es für diese Frage keine "sofortige Antwort" gibt. Es ist ein sehr häufiges Bedürfnis.

0

xxd ist der ‚Standard‘ Hex-Dump util und sieht aus wie es Ihre Probleme

34

Ich benutze oft diesen kleinen Ausschnitt, den ich vor langer Zeit geschrieben habe. Es ist kurz und einfach, überall hinzuzufügen, wenn etc Debuggen ...

#include <ctype.h> 
#include <stdio.h> 

void hexdump(void *ptr, int buflen) { 
    unsigned char *buf = (unsigned char*)ptr; 
    int i, j; 
    for (i=0; i<buflen; i+=16) { 
    printf("%06x: ", i); 
    for (j=0; j<16; j++) 
     if (i+j < buflen) 
     printf("%02x ", buf[i+j]); 
     else 
     printf(" "); 
    printf(" "); 
    for (j=0; j<16; j++) 
     if (i+j < buflen) 
     printf("%c", isprint(buf[i+j]) ? buf[i+j] : '.'); 
    printf("\n"); 
    } 
} 
+1

perfekt!das rockt. Ich benutze einen Socket-Reader und ich rief die Funktion mit "hexdump (buffer, bytecount);" und es funktioniert wie ein Charme! Danke! –

+0

printf ("% 02x", (unsigniert) (buf [i + j])); – DAG

1

I used this in einem meiner internen Tools bei der Arbeit.

2

Nur falls jemand es nützlich findet ...

I Einzelfunktions-Implementierung für ascii/hex dumper in this answer gefunden habe.

Eine C++ - Version, die auf der gleichen Antwort mit ANSI-Terminalfarben basiert, kann here gefunden werden.

Leichter als xxd.