• ベストアンサー

16進数から10進数に変換

いつもお世話になります。 先日バイナリデータを読み込み、ある特定のデータを検索し、 そのデータを10進数に変換する処理がしたいです。 FILE *fp; char buf[1024]; fp = fopen("sample.jpg","rb"); fread(buf, siZeof(char), 1024, fp); for( int i=0; i<1024; i++ ){ if( (buf[i]==0xff) && (buf[i+1] == 0xe0) ){ //※質問詳細下記します。 } } ※ f文で、buf[i+2]buf[i+3]、例えばprintf("%02x,%02x",buf[i+2],buf[i+3]); で出力すると、所望の(11 00 )の16進数で得られています。 このbuf[i+2] buf[i+3]の値を10進数に変換して得るには、 どうしたらいいでしょうか? 0x1100→4352 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

数値がintだとしたら簡単ですよ。 ただし、unsigned char buf[1024];と定義してください。 数値データのビット並びがビックエンディアンなら、 int num = (buf[i+2]<<8) + buf[i+3]; 数値データのビット並びがリトルエンディアンなら、 int num = (buf[i+3]<<8) + buf[i+2]; となります。 で、 printf( "数値=%s\n",num );

the-ai
質問者

お礼

ありがとうございます。 ビックエンディアンです。 教えて頂いたように処理すると、 所望の10進数の値を得ることが出来ました。 ありがとうございました。

その他の回答 (7)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.8

たぶん、ゴミの値と比較してるから、うまく if 文ではじかれるんでしょ^^ あまり、速度を気にしないなら、以前、示したように、一バイト毎、fread() で読めばいいです(笑)

回答No.7

ANo.5の人です。 > for( int i=0; i<1024; i++ ){ iが0から1023まで繰り返すので、iが1023のときi+1は1024になるから > if( (buf[i]==0xff) && (buf[i+1] == 0xe0) ){ buf[i+1]でbufの範囲の外にアクセスして比較してるという話ですよ? buf[0]からbuf[1023]までの1024個しか使えないからbuf[1024]は範囲外です。 あと例えば、ファイルの2048バイト目がFFで次の2049バイト目がE0のとき、1024バイトずつ処理してるから、このプログラムでは検出できませんよ。 この種類の処理では必ずぶつかる問題なので工夫してください。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★回答ではないが1つ。 ・バイナリデータの検索をしたいようですが『sample.jpg』となっています。  『jpg』ファイルは圧縮されています。  この圧縮されたデータを検索することになりますがいいの? ・『bmp』ファイルは多くの場合は無圧縮ですので 0xFFE0、0x1100 などとすれば  上手く検索できますが『jpg』では上手く検索出来ないと思いますが…。  ※16進数から10進数の変換はすでに回答があるのでそちらをどうぞ。 ・以上。参考に。

the-ai
質問者

お礼

アドバイスありがとうございます。 検索対象のJPG構造のあるフィールドを検索していますので、 問題無く検索は出来ています。

回答No.5

char buf[1024]; ... for( int i=0; i<1024; i++ ){ if( (buf[i]==0xff) && (buf[i+1] == 0xe0) ){ これでは1024バイトしかないbufの1025バイト目にアクセスしてしまいます。

the-ai
質問者

お礼

アドバイスありがとうございます。 検索対象のデータは、1024バイト範囲内のため、 バッファに1024バイト格納しています。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.4

あぁ、そういう意味か。。すみません、意味を取り違えてました^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

ん?printf("%d,%d",buf[i+2],buf[i+3]) でいいのでは?「char だから"%d" が使えないんじゃ?」と思っているということですか?char は int に格上げされますから大丈夫ですよ(心配ならキャストしておけばいい)。 あるいは、バイナリ書き込みのことをいっているなら、fwrite() を使います。 ちなみに、ほんとに何バイト読めてるか、fread() の戻り値から判断したほうがいいですよ。

回答No.2

ただ単に表示するだけであれば printf("%d", buff[i + 2] * 0x100 + buff[i + 3]); です。

the-ai
質問者

お礼

ありがとうございます。 表示できました。

関連するQ&A

専門家に質問してみよう