Question

Je travaille beaucoup avec des logiciels de communication réseau et série, il m'est donc souvent nécessaire d'avoir du code pour afficher ou enregistrer des dumps hexadécimaux de paquets de données.

Chaque fois que je fais cela, j'écris une autre routine de vidage hexadécimal à partir de zéro.Je suis sur le point de le refaire, mais j'ai pensé demander ici :Existe-t-il quelque part un bon code de vidage hexadécimal gratuit pour C++ ?

Caractéristiques que j'aimerais :

  • N octets par ligne (où N est en quelque sorte configurable)
  • dump ASCII/UTF8 facultatif à côté de l'hexadécimal
  • indentation configurable, préfixes par ligne, suffixes par ligne, etc.
  • dépendances minimales (idéalement, j'aimerais que tout le code soit dans un fichier d'en-tête, ou soit un extrait que je peux simplement coller)

Modifier: Clarification:Je recherche du code que je peux facilement insérer dans mes propres programmes pour écrire dans stderr, stdout, des fichiers journaux ou d'autres flux de sortie similaires.Je ne recherche pas un utilitaire de vidage hexadécimal en ligne de commande.

Était-ce utile?

La solution

L'outil Unix xxd est distribué dans le cadre de vim, et selon http://www.vmunix.com/vim/util.html#xxd, la source de xxd est ftp://ftp.uni-erlangen.de:21/pub/utilities/etc/xxd-1.10.tar.gz.Il a été écrit en C et compte environ 721 lignes.Les seules informations de licence fournies sont les suivantes :

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

L'outil Unix hexdump est disponible à partir de http://gd.tuwien.ac.at/softeng/Aegis/hexdump.html.Il a été écrit en C et peut être compilé à partir des sources.Il est un peu plus gros que xxd et est distribué sous GPL.

Autres conseils

J'utilise souvent ce petit extrait que j'ai écrit il y a longtemps.C'est court et facile à ajouter n'importe où lors du débogage, etc...

#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");
  }
}

Juste au cas où quelqu'un trouverait cela utile...

J'ai trouvé une implémentation de fonction unique pour le dumper ascii/hex dans cette réponse.

Une version C++ basée sur la même réponse avec les couleurs du terminal ANSI peut être trouvée ici.

Plus léger que xxd.

J'ai vu PSPad utilisé comme éditeur hexadécimal, mais je fais généralement la même chose que vous.Je suis surpris qu'il n'y ait pas de « réponse instantanée » à cette question.C'est un besoin très courant.

J'ai utilisé ça dans l'un de mes outils internes au travail.

Pourriez-vous écrire votre propre dissecteur pour Wireshark ?

Modifier:écrit avant la précision dans la question

xxd est l'utilitaire de vidage hexadécimal "standard" et il semble qu'il devrait résoudre vos problèmes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top