バイナリダンプ



バイナリダンプ
プログラム名
バージョン
機能
実行形式
実行ファイル
OS
:bindump
:0.91
:バイナリダンプ
:Linux
:bindump(要コンパイル)
:Ubuntu 18.04

バイナリデータをダンプします。
ソースファイルをコンパイルしてからお使い下さい。
ファイルにする場合はリダイレクトをお使い下さい。
※コメント部に'%'が出現した場合のバグを修正しました。

[使い方]

■./bindump の実行で簡単な説明が表示されます。


■アドレス、データ、文字コードが表示されます。


■$ gcc -w -o bindump bindump.c でコンパイルできます。


■テスト用データ


■ソース
bindump.c  bindump_2020_0412.tar.gz(UTF-8)
#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;                      // ファイル名

    if (argc != 2) {
        printf("コメント付きダンプ   \n");
        printf("Usage : %s [Fname]\n", argv[0]);
        exit (1);
    }
    fname = argv[1];                    // ファイル名

    // ファイルオープン
    fpr = fopen (fname, "rb");
    if (fpr == NULL) {
        printf ("ファイルリードエラー\n");
        printf ("%s", 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 件のコメント:

コメントを投稿