dポイントプレゼントキャンペーン実施中!

4f4b57415645→OKWAVE

ファイルから16進表記されたもの抽出し、
文字に変換してファイルに格納するプログラムを作ろうと
思っておりますが、いい方法が思い浮かばず、悩んでおります。

考えているのは、2桁毎に抽出して10進表記にし、
それをfprintf使って%cでファイルに書き込もうとしていますが、
10進表記にする際にa~fの扱いで悩んでいます。

もし、やり方自体から変えた方がいい場合もアドバイス戴けると
助かります。どうぞよろしくお願いします。

A 回答 (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;
}
    • good
    • 0

私も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;
}
    • good
    • 0
この回答へのお礼

皆様方、大変参考になりました。
ありがとうございます。

お礼日時:2008/10/22 09:09

0~9とa~fで計算の仕方を変えればいいだけだと思いますよ。


ASCIIの0~9は0x0fでandをとるのが一般的な変換方法と思いますが、
a~fでは0x37をマイナスするとか。
    • good
    • 0

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