バイナリダンプ
プログラム名 バージョン 機能 実行形式 実行ファイル OS |
:bindump :0.91 :バイナリダンプ :Windows :bindump.exe :Windows |
バイナリデータをダンプします。
ファイルにする場合はリダイレクトをお使い下さい。
※コメント部に'%'が出現した場合のバグを修正しました。
[使い方]
■bindump.exe の実行で簡単な説明が表示されます。
■アドレス、データ、文字コードが表示されます。
■テスト用データ
■ソース
bindump.c bindump_2020_0412.zip
ファイルにする場合はリダイレクトをお使い下さい。
※コメント部に'%'が出現した場合のバグを修正しました。
[使い方]
■bindump.exe の実行で簡単な説明が表示されます。
■アドレス、データ、文字コードが表示されます。
■テスト用データ
■ソース
bindump.c bindump_2020_0412.zip
// コメント付きダンプ #pragma warning(disable:4996) #include <stdio.h> #include <string.h> #include <stdlib.h> #define DST_BUF_SIZE 1024 char bin2char(unsigned char); // 0 から 15 を '0' から 'F' に変換する void ascbufclear(char*); // ASCII表示部クリアー int len; int i, dgtct; char c[16]; char adr[32]; char ascbuf[128]; char guide1[] = { " +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F\n" }; char guide2[] = { "---------------------------------------------------------------------------\n" }; char dststr[DST_BUF_SIZE]; int main(int argc, char *argv[]) { FILE *fpr; int i, ic; unsigned char uc; long long ll; int ascofs; char* fname; // ファイル名 errno_t err; if (argc != 2) { printf("コメント付きダンプ \n"); printf("Usage : %s [Fname]\n", argv[0]); exit (1); } fname = argv[1]; // ファイル名 // ファイルオープン err = fopen_s (&fpr, fname, "rb"); if (err != 0) { printf ("ファイルリードエラー\n"); printf (fname); printf ("\n"); exit (1); } strcpy(ascbuf, ": "); // 仕切り dststr[0] = 0; printf (guide1); // printf (guide2); // ガイド dgtct = 0; c[1] = 0; ascofs = 0; // ファイルリード ll = 0; while (1) { if ((dgtct%16) == 0) { sprintf(adr, "%08X ", ll); // アドレス strncat(dststr, adr, 10); ascbufclear(ascbuf); // ASCII表示部クリアー } // ASCIIコードセット ic = fgetc(fpr); if (ic == EOF) { break; } uc = (unsigned char)ic; if (0x20 <= uc && uc<= 0x7e) { if (uc == '%') { // % ascbuf[ascofs+2] = uc; ascofs++; ascbuf[ascofs+2] = uc; ascofs++; } else { ascbuf[ascofs+2] = uc; ascofs++; } } else { ascbuf[ascofs+2] = '.'; ascofs++; } c[0] = bin2char(uc/16); // 上位 strncat(dststr, c, 2); c[0] = bin2char(uc%16); // 下位 strncat(dststr, c, 2); c[0] = ' '; strncat(dststr, c, 2); dgtct++; if (dgtct >= 16) { dgtct = 0; strncat(dststr, ascbuf, ascofs+2); strncat(dststr, "\n", 2); printf (dststr); dststr[0] = 0; ascofs = 0; } ll++; } if ((dgtct%16) != 0) { for ( i = 0 ; i < ((16-(dgtct%16))*3) ; i++ ) { strncat(dststr, " ", 2); } strncat(dststr, ascbuf, 18+ascofs); strncat(dststr, "\n", 2); printf (dststr); } // ファイルクローズ if (fpr != NULL) { fclose(fpr); } exit (0); } // 0 から 15 を '0' から 'F' に変換する char bin2char(unsigned char uc) { char c; if (uc <= 9) { c = '0'+uc; } else if (10 <= uc && uc <= 15) { c = 'A'+(uc-10); } else { c = '-'+uc; printf("ERROR - bin2char()\n"); } return c; } // ASCII表示部クリアー void ascbufclear(char* ascbuf) { int i; for ( i = 0 ; i < 32 ; i++ ) { ascbuf[i+2] = ' '; } } |
0 件のコメント:
コメントを投稿