質問
私はネットワークおよびシリアル通信ソフトウェアを頻繁に使用するため、データ パケットの 16 進ダンプを表示または記録するためのコードが必要になることがよくあります。
これを行うたびに、さらに別の 16 進ダンプ ルーチンを最初から作成します。またしようと思っているのですが、ここで質問させていただきます。C++ 用の無料の 16 進ダンプ コードはどこかにありますか?
欲しい機能:
- 1 行あたり N バイト (N は何らかの方法で構成可能)
- オプションの ASCII/UTF8 ダンプと 16 進数
- 設定可能なインデント、行ごとのプレフィックス、行ごとのサフィックスなど。
- 最小限の依存関係 (理想的には、コードをすべてヘッダー ファイルに含めるか、貼り付けるだけのスニペットにすることが望ましいです)
編集: 説明:自分のプログラムに簡単にドロップして、stderr、stdout、ログ ファイル、またはその他の同様の出力ストリームに書き込むことができるコードを探しています。コマンドラインの 16 進ダンプ ユーティリティを探しているわけではありません。
解決
UNIX ツール xxd
の一部として配布されています vim
, 、そしてによると http://www.vmunix.com/vim/util.html#xxd, 、xxd のソースは次のとおりです。 ftp://ftp.uni-erlangen.de:21/pub/utilities/etc/xxd-1.10.tar.gz. 。これは C で書かれており、約 721 行あります。提供されている唯一のライセンス情報は次のとおりです。
* Distribute freely and credit me,
* make money and share with me,
* lose money and don't ask me.
UNIX ツール hexdump
から入手可能です http://gd.tuwien.ac.at/softeng/Aegis/hexdump.html. 。C で書かれており、ソースからコンパイルできます。これは xxd よりもかなり大きく、GPL に基づいて配布されています。
他のヒント
私は昔に書いたこの小さな断片をよく使います。短くて、デバッグ時などにどこにでも簡単に追加できます。
#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");
}
}
私は見た PSPad は 16 進エディタとして使用されますが、私も通常はあなたと同じことをします。この質問に対する「即座の答え」がないことに驚いています。それは非常に一般的なニーズです。
これを使いました 職場の内部ツールの 1 つで。
あなたのことを書いていただけますか 自身の解剖者 Wireshark用ですか?
編集:質問の精度の前に書かれています
xxd これは「標準」の 16 進ダンプ ユーティリティであり、問題を解決するはずです。