テキストバイナリ変換



テキストバイナリ変換
プログラム名
バージョン
機能
実行形式
実行ファイル
:text2bin
:0.90
:テキストバイナリ変換
:Linux
:text2bin

ダンプしたテキストデータをバイナリに変換します。
ソースファイルをコンパイルしてからお使い下さい。
有効な形式であれば、ダンプでなくてもバイナリに変換できます。

[使い方]

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


■変換したいテキストデータを用意します。(bindumpで作成可能)



■$ ./text2bin [入力ファイル名] [出力ファイル名] を実行します。


■odコマンドで確認できます。



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


■説明


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

#define BUF_SIZE_MAX    1024

unsigned char atouc(unsigned char);         // 数値変換
int check_cd(unsigned char);                // コードチェック

int main(int argc, char *argv[])
{
FILE    *fpr, *fpw;
int     i, errflg;
unsigned char bi, bj, bk, bl;
int     sptr;
char    sbuf[BUF_SIZE_MAX];
char    fnamer[BUF_SIZE_MAX];               // 入力ファイル名
char    fnamew[BUF_SIZE_MAX];               // 出力ファイル名

    if (argc < 3) {
        printf("テキストバイナリ変換\n");
        printf("使い方 : %s [入力ファイル名] [出力ファイル名]\n", argv[0]);
        exit (1);
    }

    // 入力ファイル名
    strncpy(fnamer, argv[1], sizeof(fnamer));
    // 出力ファイル名
    strncpy(fnamew, argv[2], sizeof(fnamew));

    fpr = NULL;
    fpw = NULL;

    // 出力ファイル存在チェック
    fpw = fopen (fnamew, "r");
    if (fpw != NULL) {
        fclose(fpw);
        errflg = 1;
    } else {
        errflg = 0;
    }

    // 上書き確認
    if (errflg != 0) {
        printf ("\n[%s] は存在します\n", fnamew);
        printf ("上書きしますか?(y or n)\n");
        i = getchar();
        if (i == 'y' || i == 'Y') {
        //  printf ("上書きします\n");
        } else {
            printf ("処理を中止します\n");
            exit (1);
        }
    }

    // ファイルオープン(リード)
    fpr = fopen (fnamer, "r");
    if (fpr == NULL) {
        printf ("ファイルリードエラー\n");
        printf ("%s", fnamer);
        printf ("\n");
        exit (1);
    }

    // ファイルオープン(ライト)
    fpw = fopen (fnamew, "wb");
    if (fpw == NULL) {
        printf ("ファイルオープンエラー\n");
        printf ("%s", fnamew);
        printf ("\n");
        if (fpr != NULL) {
            fclose(fpr);
        }
        exit (1);
    }

    errflg = 0;

    // 処理開始
    while( fgets( sbuf, sizeof( sbuf ), fpr ) != NULL ){
        bi = sbuf[0];
        if (bi != '0') {                    // スキップ(行頭が0なら有効)
            continue;
        }
        sptr = 0;
        do{
            bi = sbuf[sptr++];
        }while(bi != ' ');                  // スペース
        while (1) {
            bi = sbuf[sptr];
            if (bi == 0 || 
                bi == 0x0d || 
                bi == 0x0a || 
                sptr >= BUF_SIZE_MAX - 3) {
                break;                      // 次の行
            }
            i = check_cd(bi);               // コードチェック
            if (i != 0) {
                break;                      // 有効でなければ次の行
            }
            bi = sbuf[sptr+0];
            bj = sbuf[sptr+1];
            bi = atouc(bi);                 // 数値変換
            bj = atouc(bj);                 // 数値変換
            bl = bi * 16 + bj;
            errflg = putc(bl, fpw);         // ライト
            if (errflg == EOF) {
                break;
            }
            sptr += 3;                      // 次のコード
        }
    }

    if (errflg == EOF) {
        printf ("書き込みに失敗しました[%s]\n", fnamew);
    } else {
        printf ("[%s]に出力しました\n", fnamew);
    }

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

// 数値変換
unsigned char atouc(unsigned char bi)
{
unsigned char bj;
    if ('0' <= bi && bi <= '9') {
        bj = bi - '0';
    } else if ('a' <= bi && bi <= 'f') {
        bj = bi - 'a' + 10;
    } else if ('A' <= bi && bi <= 'F') {
        bj = bi - 'A' + 10;
    } else {
        bj = 0;
    }
    return bj;
}

// コードチェック
int check_cd(unsigned char bi)
{
    int ret;
    if ('0' <= bi && bi <= '9' || 
        'a' <= bi && bi <= 'f' || 
        'A' <= bi && bi <= 'F') {
        ret = 0;
    } else {
        ret = -1;
    }
    return ret;
}

0 件のコメント:

コメントを投稿