• ベストアンサー

配列から指定するデータを取り出す方法

お世話になります。 今、 char buf[1500]に値が入っているのですが、 バイナリデータであり、テキストエディタで バイナリモードでみると、 54,00,00,32,00,00,40,00,FF・・・ となっています。 この3~4バイト目の0x00,0x32のを 10進数にした値を得たいです。 今回の質問点を下記します。 (1)bufに格納されている3・4バイト目の値を得るにはどうしたら  いいのでしょうか?memcpy()などでやるのか? (2)得た値を10進にするにはどうしたらいいでしょうか? どうぞよろしくお願い致します。

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

  • ベストアンサー
noname#26650
noname#26650
回答No.4

>char buf={0x54, 0x00, 0x05, 0xDC}; >の場合、 >16進数:5DCを10進数1500を >int型の変数に入れる場合は、どうしたらいいでしょうか? サンプルです。 #include <stdio.h> int main(void) {   char buf[1500] = { 0x54, 0x00, 0x05, 0xDC, /* 以下省略 */ };   int m, n;      m = (unsigned char) buf[2];   n = (unsigned char) buf[3];   m = (m << 8) + n;   printf("%d\n", m);   return 0; } (注)インデントのため、全角空白を使っています。

the-ai
質問者

お礼

ありがうございました。 無事できました。 ほんとう助かりました!

すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#25383
noname#25383
回答No.5

char型は、-128~127までの値を取る型なので、-36は正しいです。 不の値が不要であれば、unsigned指定をして下さい。 試しに、共用体で一発で取り出せないか試してみました。 #include <stdio.h> int main(void) {   union {     char buf_c[4];     short buf_s[2];   }data;   data.buf_c[0] = 0x54;   data.buf_c[1] = 0x00;   data.buf_c[2] = 0x05;   data.buf_c[3] = 0xDC;   printf("%d\n",data.buf_s[1]);   return 0; } 結果は、「-9211」。 どうやら、0xDC05になってしまった模様。 環境は、Windows2000pro、コンパイラはBorlandC++builder5です。 なので、質問の値を取り出す方法としては、 #include <stdio.h> int main(void) {   char buf[1500] = { 0x54, 0x00, 0x05, 0xDC, 0x00, /* 以下省略 */ };   unsigned short m;   m = (unsigned short)buf[2] << 8 | (unsigned short)buf[3] & 0xFF;   printf("%d\n", m);   return 0; } こんな感じかな。

the-ai
質問者

お礼

ご検討していただき、ありがとうございます。 無事格納することが出来ました。

すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

>char buf={0x54, 0x00, 0x05, 0xDC}; >の場合、 >16進数:5DCを10進数1500を >int型の変数に入れる場合は、どうしたらいいでしょうか? int m, n, o;    m = buf[2]; n = buf[3]; o = m * 0x100 + n; とか o = m << 8 + n;

the-ai
質問者

補足

回答ありがとうございます。 mは、5ですが、 nは、-36になります。 0xDCを10進数にすると220となり、 教えていただいた、m*0x100 + n の式を 使えるとは思いますが、 nが-36になっています。 なぜでしょうか? また、どうすればいいでしょうか? たびたびで申し訳ございませんが、よろしくお願い致します。

すると、全ての回答が全文表示されます。
noname#26650
noname#26650
回答No.2

サンプルです。 #include <stdio.h> int main(void) {   char buf[1500] = { 0x54, 0x00, 0x00, 0x32, 0x00, /* 以下省略 */ };   int m, n;      m = buf[2];   n = buf[3];   printf("%d %d\n", m, n);   return 0; } (注)インデントのため、全角空白を使っています。

the-ai
質問者

補足

早速の回答ありがとうございます。 char buf={0x54, 0x00, 0x05, 0xDC}; の場合、 16進数:5DCを10進数1500を int型の変数に入れる場合は、どうしたらいいでしょうか? よろしくお願い致します。

すると、全ての回答が全文表示されます。
  • JF1Msf
  • ベストアンサー率20% (18/88)
回答No.1

printf("%d %d?n", buf[2], buf[3]); などとするだけでいいんじゃないでしょうか。 (1) char型は1バイトでしょうから、3,4バイトめはそれぞれbuf[2], buf[3] (2) printf, fprintf, sprintfなどで、%dを使えば10進数表示になるでしょう

すると、全ての回答が全文表示されます。

関連するQ&A