拡張バイナリダンプ
プログラム名 バージョン 機能 実行形式 実行ファイル OS |
:bindumpex :0.90 :拡張バイナリダンプ :Windows :bindumpex.exe :Windows |
バイナリデータを表示開始アドレスとカラム数を指定してダンプします。
ファイルにする場合はリダイレクトをお使い下さい。
[使い方]
■bindumpex.exe の実行で簡単な説明が表示されます。
■アドレス、データ、文字コードが表示されます。
■テスト用データ
■ソース
bindumpex.c bindumpex.zip
ファイルにする場合はリダイレクトをお使い下さい。
[使い方]
■bindumpex.exe の実行で簡単な説明が表示されます。
■アドレス、データ、文字コードが表示されます。
■テスト用データ
■ソース
bindumpex.c bindumpex.zip
// 拡張コメント付きダンプ #pragma warning(disable:4996) #include <stdio.h> #include <string.h> #include <stdlib.h> #define DST_BUF_SIZE 2048 #define ASC_BUF_MAX 512 char bin2char(unsigned char); // 0 から 15 を '0' から 'F' に変換する void ascbufclear(char*); // ASCII表示部クリアー int num_chk_hex(char* num_str); // 数値チェック(16進数) int num_chk(char* num_str); // 数値チェック int hexatoi(char*); // 16進数文字列数値変換 int atoi2(char*, int*); // 文字列を数値に変換する(16進数対応) int len; int i, dgtct; char c[16]; char adr[32]; char ascbuf[ASC_BUF_MAX]; char dststr[DST_BUF_SIZE]; int main(int argc, char *argv[]) { FILE *fpr; int i, ic, start_adr, clm, flg; unsigned char uc; long long ll; int ascofs; char* fname; // ファイル名 errno_t err; if (argc < 4) { printf("拡張コメント付きダンプ(表示開始アドレス、カラム数指定対応)\n"); printf("使い方 : %s [ファイ名] [表示開始アドレス] [カラム数]\n", argv[0]); exit (1); } start_adr = atoi2(argv[2], &flg); // 文字列を数値に変換する(16進数対応) if (!flg) { printf("表示開始アドレスが不正です(16進数対応) : [%s]\n", argv[2]); exit (1); } clm = atoi2(argv[3], &flg); // 文字列を数値に変換する(16進数対応) if (!flg) { printf("カラム数が不正です(16進数対応) : [%s]\n", argv[3]); exit (1); } if (clm == 0 || clm > 256) { printf("カラム数は1以上256以下にして下さい\n"); 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("\n"); printf(" "); for ( i = 0 ; i < clm ; i++ ) { printf("%02X ", i); } printf("\n"); // 仕切り表示 for ( i = 0 ; i < (9+clm*3+2+clm) ; i++ ) { printf("-"); } printf("\n"); dgtct = 0; c[1] = 0; ascofs = 0; // ファイルリード ll = (long long)start_adr; while (1) { if ((dgtct%clm) == 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 >= clm) { dgtct = 0; strncat(dststr, ascbuf, ascofs+2); strncat(dststr, "\n", 2); printf (dststr); dststr[0] = 0; ascofs = 0; } ll++; } if ((dgtct%clm) != 0) { for ( i = 0 ; i < ((clm-(dgtct%clm))*3) ; i++ ) { strncat(dststr, " ", 2); } for ( i = 0 ; i < (clm-(dgtct%clm)) ; i++ ) { uc = ' '; ascbuf[i+2+(dgtct%clm)] = uc; } // 最後の行の改行コードがおかしくなるのでstrncatする前にnullを追加 uc = 0; ascbuf[i+2+(dgtct%clm)] = uc; strncat(ascbuf, "\n", 3); strncat(dststr, ascbuf, clm+2+3); 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) { memset(ascbuf, 0, sizeof(ascbuf)); strcpy(ascbuf, ": "); // 仕切り } // 数値チェック(16進数) int num_chk_hex(char* num_str) { int i, len, flg; unsigned char uc; flg = 0; len = strlen(num_str); for ( i = 0 ; i < len ; i++ ) { uc = num_str[i]; if (!(('0' <= uc && uc <= '9') || ('A' <= uc && uc <= 'F') || ('a' <= uc && uc <= 'f'))) { flg = -1; break; } } return flg; } // 数値チェック int num_chk(char* num_str) { int i, len, flg; unsigned char uc; flg = 0; len = strlen(num_str); for ( i = 0 ; i < len ; i++ ) { uc = num_str[i]; if (!('0' <= uc && uc <= '9')) { flg = -1; break; } } return flg; } // 16進数文字列数値変換 int hexatoi(char* hexasc) { int i, len, iRet; unsigned char uc; iRet = 0; len = strlen(hexasc); if (len == 0) { return iRet; } for ( i = 0 ; i < len ; i++ ) { uc = hexasc[i]; if ('0' <= uc && uc <= '9') { iRet *= 16; iRet += uc - '0'; continue; } if ('a' <= uc && uc <= 'f') { iRet *= 16; iRet += uc - 'a' + 10; continue; } if ('A' <= uc && uc <= 'F') { iRet *= 16; iRet += uc - 'A' + 10; } } return iRet; } // 文字列を数値に変換する(16進数対応) int atoi2(char* asc, int* flg) { int len, hex_flg, err, iRet; hex_flg = 0; len = strlen(asc); if (len == 0) { *flg = 0; return 0; // null ならエラー } if (strncmp(asc, "-", 1) == 0) { *flg = 0; return 0; // マイナスならエラー } if (len >= 2) { if (strncmp(asc, "0x", 2) == 0 || strncmp(asc, "0X", 2) == 0) { hex_flg = 1; } } if (hex_flg) { err = num_chk_hex(asc+2); // 数値チェック(16進数) if (err == -1) { *flg = 0; return 0; } iRet = hexatoi(asc+2); // 16進数文字列数値変換 } else { err = num_chk(asc); // 数値チェック if (err == -1) { *flg = 0; return 0; } iRet = atoi(asc); } return iRet; } |
0 件のコメント:
コメントを投稿