表示レイアウト文字列指定ダンプ



表示レイアウト(フォーマット)文字列指定ダンプ
プログラム名
バージョン
機能
実行形式
実行ファイル
OS
:DumpStrLayout
:0.90
:表示レイアウト(フォーマット)文字列指定ダンプ
:Linux
:DumpStrLayout(要コンパイル)
:Ubuntu 18.04

1行のレイアウト(フォーマット)を数字文字列で指定し、アドレスなしでダンプします。
ファイルにする場合はリダイレクトをお使い下さい。

[使い方]

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


■指定したレイアウトでバイナリデータが表示されます。


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


■テスト用データ


■ソース
DumpStrLayout.c  DumpStrLayout.tar.gz(UTF-8)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_PATH_LEN    4096
#define MAX_LAYOUT_LEN  32
char    fname[MAX_PATH_LEN];                // 入力ファイル名
char    str_layout[MAX_LAYOUT_LEN];         // レイアウト文字列
unsigned char uc;
int     ct, rec_max, endian;
FILE    *fpr;

// プロトタイプ
int layout_str_check(char*);                // 表示レイアウト(フォーマット)文字列チェック
int dump(int);                              // ダンプ

int main(int argc, char *argv[])
{
    int     idx;

    if (argc < 4) {
        printf("表示レイアウト(フォーマット)文字列指定ダンプ\n");
        printf ("使い方:DumpStrLayout [入力ファイル名] \n");
        printf ("                     [バイトオーダー:-L or -B] \n");
        printf ("                     [レイアウト(数字文字列)]\n");
        printf ("1行のレイアウト(フォーマット)を数字文字列で指定し、アドレスなしでダンプします\n");
        printf ("レイアウト(数字文字列)の説明\n");
        printf ("  1 - 1バイト\n");
        printf ("  2 - 2バイト\n");
        printf ("  4 - 4バイト\n");
        printf ("  8 - 8バイト\n");
        printf ("[例]\n");
        printf ("$ ./DumpStrLayout TEST.bin -B 112444\n");
        exit (0);
    }

    // エンディアンチェック
    if (strcmp(argv[2], "-l") == 0 || strcmp(argv[2], "-L") == 0) {
        endian = 0;
    } else if (strcmp(argv[2], "-b") == 0 || strcmp(argv[2], "-B") == 0) {
        endian = 1;
    } else {
        printf("エンディアンは -l か -L か -b か -B で 指定して下さい\n");
        exit (1);
    }

    // 表示レイアウト(フォーマット)文字列数チェック
    if (strlen(argv[3]) > MAX_LAYOUT_LEN-2) {
        printf("表示レイアウト(フォーマット)文字列は%d文字以下で指定して下さい\n", MAX_LAYOUT_LEN-2);
        exit (1);
    }

    strncpy(str_layout, argv[3], sizeof(str_layout));

    // 表示レイアウト(フォーマット)文字列チェック
    if (layout_str_check(str_layout)) {
        printf("表示レイアウト(フォーマット)文字列は [1 or 2 or 4 or 8] で指定して下さい\n");
        exit (1);
    }

    // ファイル名セット
    strncpy(fname, argv[1], sizeof(fname));
    fname[MAX_PATH_LEN-1] = 0;              // ガード

    fpr = NULL;

    // ファイルオープン
    fpr = fopen (fname, "rb");
    if (fpr == NULL) {
        printf( "ファイルオープンエラー\n" );
        printf(fname);
        printf("\n");
        exit (1);
    }

    ct  = 0;                            // カウンタ
    idx = 0;                            // インデックス

    // 処理開始
    while (1) {
        uc = str_layout[idx++];
        if (uc == 0) {
            idx = 0;
            printf("\n");
            continue;
        }
        if (!dump((int)(uc - 0x30))) {
            printf("\n");
            break;
        }
    }

    // ファイルクローズ
    if (fpr != NULL) {
        fclose(fpr);
    }

    exit (0);
}

// ダンプ
int dump(int isize)
{
    int i, j, iRet;
    unsigned char num_buf[8];
    memset(num_buf, 0, sizeof(num_buf));
    iRet = 1;
    for ( i = 0 ; i < isize ; i++ ) {
        j = fgetc(fpr);
        if (j == EOF) {
            iRet = 0;
            if (i == 0) {
                return iRet;
            }
            break;
        }
        num_buf[i] = (unsigned char)j;
    }
    if (endian == 0) {
        // ビッグエンディアン
        for ( i = 0 ; i < isize ; i++ ) {
            printf("%02X", (int)num_buf[isize-i-1]);
        }

    } else {
        // リトルエンディアン
        for ( i = 0 ; i < isize ; i++ ) {
            printf("%02X", (int)num_buf[i]);
        }
    }
    printf(" ");
    return iRet;
}

// 表示レイアウト(フォーマット)文字列チェック
int layout_str_check(char* str)
{
    int i, len, iRet;
    unsigned char uc;
    len = (int)strlen(str);
    iRet = 0;
    for ( i = 0 ; i < len ; i++ ) {
        uc = str[i];
        if ( !(uc == '1' || uc == '2' || uc == '4' || uc == '8') ) {
            iRet = 1;
            break;
        }
    }
    return iRet;
}

0 件のコメント:

コメントを投稿