- ベストアンサー
16進表記から文字に変換
4f4b57415645→OKWAVE ファイルから16進表記されたもの抽出し、 文字に変換してファイルに格納するプログラムを作ろうと 思っておりますが、いい方法が思い浮かばず、悩んでおります。 考えているのは、2桁毎に抽出して10進表記にし、 それをfprintf使って%cでファイルに書き込もうとしていますが、 10進表記にする際にa~fの扱いで悩んでいます。 もし、やり方自体から変えた方がいい場合もアドバイス戴けると 助かります。どうぞよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> #include <stdlib.h> int main(void) { char *s = "4f4b57415645"; char x[3]; int i, c; for(i = 0; i < 12; i += 2){ sscanf(&s[i], "%2s", x); putchar(strtol(x, NULL, 16)); } putchar('\n'); for(i = 0; i < 12; i += 2){ sscanf(&s[i], "%2x", &c); putchar(c); } return 0; }
その他の回答 (2)
- cortotbach
- ベストアンサー率44% (8/18)
私もNo.1の方の方法に概ね一緒ですね。重い標準ライブラリ(文字列処理系)も使う必要も無いので軽量です。片手間に書いたので汚いですが、参考になりますでしょうか。 #include <cstdio> int getIntFromChar(const char c) { if(c >= '0' && c <= '9') { return (int)c - (int)'0'; } else if(c >= 'A' && c <= 'F') { return 10 + (int)c - (int)'A'; } else if(c >= 'a' && c <= 'f') { return 10 + (int)c - (int)'a'; } return 0; // error (not hex char) } int main(int argc, char** argv) { char str[] = "4f4b57415645"; // 文字列の長さチェック(strlenを敢えて使わない) int lengthOfStr = 0; while( true ) { if(str[lengthOfStr] == '\0') { break; } lengthOfStr++; } char *outStr = new char[lengthOfStr / 2 + 1]; for(int i = 0; i < lengthOfStr; i += 2) { char c = (::getIntFromChar(str[i]) * 16) + ::getIntFromChar(str[i + 1]); *(outStr + (i / 2)) = c; printf("%d, %c\n", i, c); } *(outStr + lengthOfStr / 2) = '\0'; // 終端 printf("%s\n", outStr); delete outStr; return 1; }
- rub_oil
- ベストアンサー率14% (3/21)
0~9とa~fで計算の仕方を変えればいいだけだと思いますよ。 ASCIIの0~9は0x0fでandをとるのが一般的な変換方法と思いますが、 a~fでは0x37をマイナスするとか。
お礼
皆様方、大変参考になりました。 ありがとうございます。