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

お世話になります。

今、
char buf[1500]に値が入っているのですが、
バイナリデータであり、テキストエディタで
バイナリモードでみると、
54,00,00,32,00,00,40,00,FF・・・
となっています。
この3~4バイト目の0x00,0x32のを
10進数にした値を得たいです。

今回の質問点を下記します。

(1)bufに格納されている3・4バイト目の値を得るにはどうしたら
 いいのでしょうか?memcpy()などでやるのか?
(2)得た値を10進にするにはどうしたらいいでしょうか?

どうぞよろしくお願い致します。

A 回答 (5件)

>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;
}

(注)インデントのため、全角空白を使っています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/19 17:18

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;
}

こんな感じかな。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/19 17:21

>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;

この回答への補足

回答ありがとうございます。
mは、5ですが、
nは、-36になります。

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

補足日時:2007/02/19 15:21
    • good
    • 0

サンプルです。



#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;
}

(注)インデントのため、全角空白を使っています。

この回答への補足

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

char buf={0x54, 0x00, 0x05, 0xDC};
の場合、
16進数:5DCを10進数1500を
int型の変数に入れる場合は、どうしたらいいでしょうか?

よろしくお願い致します。

補足日時:2007/02/19 13:41
    • good
    • 0

printf("%d %d?n", buf[2], buf[3]);


などとするだけでいいんじゃないでしょうか。

(1) char型は1バイトでしょうから、3,4バイトめはそれぞれbuf[2], buf[3]
(2) printf, fprintf, sprintfなどで、%dを使えば10進数表示になるでしょう
    • good
    • 0

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