拡張バイナリダンプ
| プログラム名 バージョン 機能 実行形式 実行ファイル OS |
:bindumpex :0.90 :拡張バイナリダンプ :Linux :bindumpex(要コンパイル) :Ubuntu 18.04 |
バイナリデータを表示開始アドレスとカラム数を指定してダンプします。
ソースファイルをコンパイルしてからお使い下さい。
ファイルにする場合はリダイレクトをお使い下さい。
[使い方]
■./bindumpex の実行で簡単な説明が表示されます。
■アドレス、データ、文字コードが表示されます。
■$ gcc -w -o bindumpex bindumpex.c でコンパイルできます。
■テスト用データ
■ソース
bindumpex.c bindumpex.tar.gz(UTF-8)
ソースファイルをコンパイルしてからお使い下さい。
ファイルにする場合はリダイレクトをお使い下さい。
[使い方]
■./bindumpex の実行で簡単な説明が表示されます。
■アドレス、データ、文字コードが表示されます。
■$ gcc -w -o bindumpex bindumpex.c でコンパイルできます。
■テスト用データ
■ソース
bindumpex.c bindumpex.tar.gz(UTF-8)
#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; // ファイル名
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]; // ファイル名
// ファイルオープン
fpr = fopen (fname, "rb");
if (fpr == NULL) {
printf ("ファイルリードエラー\n");
printf ("%s", 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 件のコメント:
コメントを投稿