教えて! goo のコンテンツに対する取り組みについて

16進数の文字列を2進数に変換して、int型の配列に1or0で書き込んでいきたいんですが、どうすればいいのかわかりません。よろしくお願いします。

教えて!goo グレード

A 回答 (3件)

即席ですが。

ctype.hとかstdlib.hとか要ると思います。
戻り値>=0で正常終了。その場合は書き込まれた長さ(使った配列の要素数)が返ります。

int hexToBinary(char* src, int* dest) {
char c;
int x, i;
char* p = src;
while(*p != NULL) {
c = tolower(*p);
if (isdigit(c)) {
x = c - '0';
} else if (c >= 'a' && c <= 'f') {
x = c - 'a' + 10;
} else {
return -1;
}
for (i=0; i<4; i++,x>>=1) {
dest[3-i] = x & 1;
}
p++;
dest+=4;
}
return (p-src)*4;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。よくわかりました。これで、解決しそうです。

お礼日時:2002/05/13 01:37

16進数は当然16パターンしかないわけですから、1文字ずつそのパターンにあわせて変換していってはどうでしょうか?


1は0,0,0,1 2は0,0,1,0 3は0,0,1,1・・・という具合に。
でint型の配列を4ずつ進ませて書き込んでいくってのは駄目ですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。できれば、16パターンcase文で作るよりもいい方法があればよろしくお願いします。

お礼日時:2002/05/13 01:36

int配列への格納の仕方が桁数固定なのか可変なのか、


およびリトルエンディアンなのかビッグエンディアンなのか(下の桁を配列の前に格納するか後ろに格納するか)で
コードの書き方には差が出ますので、概略のみ書きます。

2^4=16ですから、16進数1桁が2進数4桁に対応することに注意します。
文字列から1文字を読み込み、
・数字であれば'0'を引く
・英字であれば小文字に直してから'a'を引き、10を足す。
とすれば、数値として0~15になります。
この数値をxと書きます。
x&1で最下位ビットの状態が得られるので、これをint型配列に格納します。
さらにx>>=1とし、再び最下位ビットを得て格納、...を4回行います。
次の文字を読み込み、同様に処理します。

というような手順になります。
次の変換のうち、どれをやりたいのかを提示していただければより具体的な回答が得られるかと思います。
例:"1d"の変換として、どれを得たいのか
1.{0,0,0,1,1,1,0,1}
2.{1,1,1,0,1}
3.{1,0,1,1,1,0,0,0}
4.{1,0,1,1,1}
    • good
    • 1
この回答へのお礼

回答ありがとうございます。アンド演算とシフト演算のところはよくわかりました。助かります。
例は、1番の形でお願いします。
あと、
・数字であれば'0'を引く
・英字であれば小文字に直してから'a'を引き、10を足す。
というところがどのようにすればいいのかよくわかりません。できれば、もう少し詳しくお願いします。

お礼日時:2002/05/12 21:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング