拡張バイナリダンプ



拡張バイナリダンプ
プログラム名
バージョン
機能
実行形式
実行ファイル
OS
:bindumpex
:0.90
:拡張バイナリダンプ
:Windows
:bindumpex.exe
:Windows

バイナリデータを表示開始アドレスとカラム数を指定してダンプします。
ファイルにする場合はリダイレクトをお使い下さい。

[使い方]

■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 件のコメント:

コメントを投稿