データ変換

[戻る]
だめだめ 2002/01/18(金) 12:44:47
Hexの変換をおこなっているのですが、
まず  データを
char buf[];
char data[] = "1";
sprintf (buf ,"%x" , DATA);
この時、bufに"31"とデータを取得します。
その後、bufの"31"から整数 1を取得したいのですが
この場合の変換方法を教えて下さい。
よろしくお願いします。

TAKA 2002/01/18(金) 13:07:40
一桁だけなら単純に
if (buf[0] == '3') {
    kekka = (int)(buf[1] - '0');
}
でできます。
また、もっと桁があるなら

keta = 1;
for( i = 0; i < strlen(buf); i+=2) {
    if (buf[i] == '3') {
        kekka = (int)(buf[i+1] - '0') * keta;
        keta *= 10;
    }
}
でできるはず。
かんがえればいろいろ方法あるはずですね。

EIJI 2002/01/18(金) 14:39:48
buf[i+1]が'a'から'f'の場合は、「- '0'」ではなくて、「- 'W'」になりますね。

TAKA 2002/01/18(金) 14:57:37
EIJIさんの意見で気づいて前文訂正です。
HEXでしたね・・
一桁だけなら単純に
if (buf[0] == '3') {
    if (buf[1] >= '0' && buf[1] <= '9') {
        kekka = (int)(buf[1] - '0');
    }
    else if (buf[1] >= 'A' && buf[1] <= 'F') {
        wk = 10;
        wk += (int)(buf[1] - 'A');
        kekka = wk;
    }
    else if (buf[1] >= 'a' && buf[1] <= 'f') {
        wk = 10;
        wk += (int)(buf[1] - 'a');
        kekka = wk;
    }
    else {
         // エラーです
    }
}
でできます。
また、もっと桁があるなら

keta = 1;
for( i = strlen(buf) - 1; i > 0 i-=2) {
    if (buf[i-1] == '3') {
        if (buf[i] >= '0' && buf[i] <= '9') {
            wk = (int)(buf[i] - '0');
        }
        else if (buf[i] >= 'A' && buf[i] <= 'F') {
            wk = 10;
            wk += (int)(buf[i] - 'A');
        }
        else if (buf[i] >= 'a' && buf[i] <= 'f') {
            wk = 10;
            wk += (int)(buf[i] - 'a');
        }
        else {
             break;
             // エラーです
        }
        wk *= keta;
        kekka += wk;
        keta *= 16;
    }
}
でできるはず。
かんがえればいろいろ方法あるはずですね。

TAKA 2002/01/18(金) 15:12:26
あれれ、初め数値だから'A'-'F'はないですね。
よって初めのでいいはずです。
一つ前の意見は読まないで下さい。
しかもまちがっているので・・・。
'A'や'a'だとHEXは'3X'ではないため
使えません。
よって破棄です。

EIJI 2002/01/18(金) 16:11:30
私の勘違いでした。ごめんなさい。(陳謝)
"31" => 1 変換でしたね。
"3132333435" => 12345 変換するコードを実際に試してみました。

kekka = 0;
for( i = 0; i < strlen(buf); i+=2) {
    if (buf[i] == '3') {
        kekka = kekka * 10 + (int)(buf[i+1] - '0');
    }
}

実際に使うときは桁あふれとかに注意してください。

古いスレッドには追加発言できません。