プロが教える店舗&オフィスのセキュリティ対策術

test1.txtというファイルから文字列を読み出して16進数に変換、という処理をしたいのですがうまくいきません。どこがどう悪いのでしょうか?ご教授のほどお願いします。
----------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
FILE *fp;
char *fname = "test1.txt";
char str[100];
int num;

fp = fopen( fname, "r" );
if( fp == NULL ){
printf( "%s is not open.\n", fname );
return -1;
}

while( fgets(str, 100, fp ) != NULL ){
num = strtol(str, NULL, 16);
printf( "%s", str );
printf("%x\n", num); //ここでうまく出力されません
}

fclose( fp );
return 0;
}
----------------
ちなみに、test1.txtの中身は以下のようになってます。
44DB4147E6075A92E878EB68C44DD51F
5DCE86622D846BF272215A792AF31A3E
46FF69A29D3DF1D4842461B239256C26

A 回答 (4件)

strtol()はlong値を返却するのをintで受けていますね。


これは大した問題ではないですが...
変換結果が変数num(実際long値)の最大値を超えているので
結果的strtol()でエラーが発生していると思われます。
strtol()の結果を判定しましょう。

この回答への補足

回答ありがとうございます。
int num;を
long num;に変更してみましたが、結果はかわりませんでした。
------出力結果-------
44DB4147E6075A92E878EB68C44DD51F
7fffffff
5DCE86622D846BF272215A792AF31A3E
7fffffff
46FF69A29D3DF1D4842461B239256C26
7fffffff
---------------------
文字列としての出力はうまくいっているのですが、これを16進数の数値として出力しようとすると
7fffffff
と出力されてしまいます。

もう少し検討してみます。

補足日時:2009/12/17 15:32
    • good
    • 0

処理系の情報も何もなくただ「うまくいかない」とだけ言われても判断のしようがありません. この手の質問は「うまくいかないからしている」はずだからです.


「どのようにうまくいかないのか」, 特に「どのような結果を期待したのか」「実際の結果はどうだったのか」を明確に記してください.

この回答への補足

回答ありがとうございます。
すいません。情報不足ですね。補足いたします。

while( fgets(str, 100, fp ) != NULL ){
num = strtol(str, NULL, 16);
printf( "%s", str ); //読み込んだ文字列の確認
printf("%x\n", num); //文字列を16進数に変換した値を出力し確認

上記の部分なんですが、while文の条件のところで文字列を1行読み込み、
次の行で、読み込んだ文字列を16進数に変換しnumに代入、という処理を行ったつもりです。

期待した実行結果は、
44DB4147E6075A92E878EB68C44DD51F <--文字列
44DB4147E6075A92E878EB68C44DD51F <--16進数
でしたが、実際には

44DB4147E6075A92E878EB68C44DD51F
7fffffff
5DCE86622D846BF272215A792AF31A3E
7fffffff
46FF69A29D3DF1D4842461B239256C26
7fffffff

という出力結果がでました。

補足日時:2009/12/17 15:51
    • good
    • 0

44DB4147E6075A92E878EB68C44DD51F


5DCE86622D846BF272215A792AF31A3E
46FF69A29D3DF1D4842461B239256C26

これらの16進文字列をビット換算すると128ビットもあります。Cで128ビットも保持できる変数なんてあったかな?

Windows系で半分の64ビットなら_strtoi64を使えば出来るけど、128ビットは・・・
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

上記では16進数に変換までの記述ですが、実際にはこそからさらに2進数に変換したいんです。

お礼日時:2009/12/17 15:58

その結果なら #1 のいわれる通りで, 「strtol で変換しようとしたときにオーバフローした」ことが原因です. ちなみにオーバフローしたかどうかは strtol のあとで errno を調べればわかる.


ちなみにだけど「2進数に変換したい」ってどういうことでしょうか? 「2進文字列にしたい」なら意味はありますけど, 「数値」ということだとこのままでは意味ないですよ.
まあもっとも, 「2進文字列にする」だけならわざわざ整数を経由しないか....
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
エラーの原因がわかりました。またいろいろ試してみようと思います。

お礼日時:2009/12/17 18:11

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