表示レイアウト(フォーマット)文字列指定ダンプ
| プログラム名 バージョン 機能 実行形式 実行ファイル OS |
:DumpStrLayout :0.90 :表示レイアウト(フォーマット)文字列指定ダンプ :Linux :DumpStrLayout(要コンパイル) :Ubuntu 18.04 |
1行のレイアウト(フォーマット)を数字文字列で指定し、アドレスなしでダンプします。
ファイルにする場合はリダイレクトをお使い下さい。
[使い方]
■./DumpStrLayout の実行で簡単な説明が表示されます。
■指定したレイアウトでバイナリデータが表示されます。
■$ gcc -w -o DumpStrLayout DumpStrLayout.c でコンパイルできます。
■テスト用データ
■ソース
DumpStrLayout.c DumpStrLayout.tar.gz(UTF-8)
ファイルにする場合はリダイレクトをお使い下さい。
[使い方]
■./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 件のコメント:
コメントを投稿