mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【C言語】CORBA通信定義用のIORファイルをざっくりと解析

//
// 【CORBA通信定義用のIORファイルをざっくりと解析】
// (c) 2017 mikan
// ※使用にあたっては利用者の自己責任でお願いします。
//
//    len     : IORファイルのサイズ
//    in_buff : IORファイルの中身(文字列)
//    out_buff: 解析結果
//
int IOR_Check(const int len, const char *in_buff, char *out_buff)
{
    int i;
    int x;
    int n;
    int rts;

    // ----- ヘッダは読み飛ばすチェック("IOR:")
    i = 0;
    if(strncmp(in_buff, "IOR:", 4) == 0) {
        i = 4;
    }

    // ----- 16進文字列をASCII文字列に変換
    for(x = 0; i < len; i += 2) {
        // --- 上1桁を数値に変換
        rts = atox(buff[i]);
        if(rts == -1) {
            out_buff[x] = 0;
            return -1;
        }
        n = rts * 16;

        // --- 下1桁を数値に変換
        rts = atox(buff[i+1]);
        if(rts == -1) {
            out_buff[x] = 0;
            return -1;
        }

        // 上1桁と下1桁を足して、ASCII文字コードを生成
        n += rts;

        // ASCII文字コードを判定して文字列を編集
        if(n == 0x00) {    // NULLの場合
            out_buff[x] = '_';
        } else if(n >= 0x01 && n <= 0x1f){    // 制御コード
            out_buff[x] = '*';
        } else if(n >= 0x20 && n <= 0x7e){    // 表示可能なASCII文字コード
            out_buff[x] = n;
        } else {    // 制御コード
            out_buff[x] = '*';
        }
        x ++;
    }
    out_buff[x] = 0;    // 文字列の最後にNULLを設定

    return 0;
}

//
// 16進ASCII文字を数値へ変換
//
struct  ASCII_TBL {
    char a; // 16進ASCII文字
    int     n; // 10進数値
} ascii_tbl[24] = {
    {'0',  0}, {'1',  1}, {'2',  2}, {'3',  3}, {'4',  4},
    {'5',  5}, {'6',  6}, {'7',  7}, {'8',  8}, {'9',  9},
    {'a', 10}, {'b', 11}, {'c', 12}, {'d', 13}, {'e', 14}, {'f', 15},
    {'A', 10}, {'B', 11}, {'C', 12}, {'D', 13}, {'E', 14}, {'F', 15},
    {' ', -1},
};
int atox(const char a)
{
    int i;

    for(i = 0; ascii_tbl[i].n != -1; i ++) {
        if(ascii_tbl[i].a == a) {
            return ascii_tbl[i].n;
        }
    }
    return -1;
}