• ベストアンサー

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

お世話になります。 今、 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

  • 2次元配列への格納方法について

    こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

  • テキストデータをバイナリデータに変換したい

    テキストファイルに以下のデータがあるとします。 テキストデータの中身、 「 000E6D4181AA,1234567890ABCDEF 0123456789AB,0100000000000000 050505AAAAAA,0200000000000000 070707BBBBBB,0300000000000000 012345CCCCCC,0400000000000000 cdef01DDDDDD,0500000000000000  ・  ・  ・ 」 12桁の数値(16進数)と16桁の数値(16進数)を「,」で区切ります。1行の終端は改行しています。 このテキストファイルにあるデータを以下のバイナリ形式に変換させたいのです。バイナリ形式の各行の16バイト目は、テキストデータにはデータがないので、「00」とします。「,」で区切ったバイナリ形式は「2C」になると思います。 テキストデータの左上から順に「00」は以下の、左上から順の「00」に対応します。 バイナリデータの中身、 「 00 0E 6D 41 81 AA 2C 12 34 56 78 90 AB CD EF 00 01 23 45 67 89 AB 2C 01 00 00 00 00 00 00 00 00 05 05 05 AA AA AA 2C 02 00 00 00 00 00 00 00 00 07 07 07 BB BB BB 2C 03 00 00 00 00 00 00 00 00 01 23 45 CC CC CC 2C 04 00 00 00 00 00 00 00 00 CD EF 01 DD DD DD 2C 05 00 00 00 00 00 00 00 00  ・  ・  ・ 」 ソースコードでの例、 テキストデータ1行目の1つ目の「,」までのデータ「000E6D4181AA」を、メモリ領域に読み込む。2桁の数値を1バイトで格納する。 つまり、 char buf[6]とすると、 buf[0]=0xAA buf[1]=0x81 buf[2]=0x41 buf[3]=0x6D buf[4]=0x0E buf[5]=0x00 とこのようにメモリに格納したいのです。 格納するバイトオーダーはリトルエンディアン方式とします。 以上で、質問を終わりますが、質問が上手くできていないと思いますので、説明に不備があるかもしれません。その時はお手数ですが、連絡下さい。

  • javaのbyte配列へintなどを埋め込む方法

    javaのbyte配列へintなどを埋め込む方法 java初心者です。データ編集がわからなくて悩んでいます。 下記のコードは"棒読みちゃん"といソフトへのTCPパケットを作成するコードです。 char buf[15]; *((short*)&buf[0]) = 0x0001; *((short*)&buf[2]) = speed; *((short*)&buf[4]) = tone; *((short*)&buf[6]) = volume; *((short*)&buf[8]) = voice; *((char* )&buf[10]) = 2; *((long* )&buf[11]) = len; 同じことをJAVAでしたいのですがわかりません。 (バイト型配列へint,long型を簡単に埋め込む方法がわかりません) よろしくお願いします。 よかったら、こちらもお願いします memcpy(&buf[15],message,strlen(messege)); TCPパケットのようなデータ処理が頻繁にある場合、 このようなコードは、どうしたらいいでしょうか? *((unsigned char* )&buf[15]) = message; CとJAVAになってますが、このような処理を簡単に書けないでしょうか?

    • ベストアンサー
    • Java
  • 18バイトサイズに全て1を格納する方法

    お世話になります。 18バイトに数字の1を全て入れる場合はどうしたいいのでしょうか? char * buf; buf = new char[18]; bufの入れる全てに数字の1を格納するにはどうしたらいいのでしょうか? よろしくお願い致します。

  • ビット演算について

    いつもお世話になります。 ビット演算について教えて下さい。 unsigned char buf1[1]=0x5a unsigned char buf1[2]=0x04 unsigned char buf1[3]=0x38 5a0438(16)を3バイトの値を12ビットずつの整数で得るにはどうしたらいいのでしょうか? 2進数表記では、 5A | 04 | 38 01011010 | 00000100 | 00111000 12ビットずつとは、 010110100000 010000111000 と区分し、10進数の整数値で得たいです。どのようにすればよいでしょうか? また、0x5Aなどの16進数を2進数のビットで考えるときに、 01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか? 上記2点、どうぞよろしくお願い致します。

  • C言語の配列の扱い

    次のような配列bufと変数dataを宣言して bufの中身をdataにコピーしたいのですが、 buf[0]のみで、buf[1]の値が入りません。 具体的には、buf[0]には16進数で0x3f、 buf[1]には0x3aが入っていて、 dataの値を0x3a3fにしたいのです。 教えてください。 ***************************** unsigned char buf[2]; unsigned short data; data = (unsigned short)*buf; *****************************

  • メモリ上に配置されていないバイト配列を代入

    memcpyでメモリ上に配置されていないバイト配列を代入する方法を教えて下さい。 #include<iostream.h> int main() { char str[3]; memcpy(str,"aa",3); printf("%s",str); return 0; } これは分かるんですが、バイト配列では"aa"のところに何を書けばいいんですか? memcpy(str, (char *){0x61,0x61,0x0}, 3);ではコンパイルできませんでした。 str[0]=0x61;のように1つずつなら代入できるんですが、配列ごとの方法が分かりません。

  • バイナリファイルの計算方法

    バイナリデータをはじめて扱う初心者です。 バイナリデータファイルからデータを読み出したいと思います。 環境はWindowsXPとLabView7.1です。 バイナリエディタで見てみると、  E8 03 と格納されている、2バイトshort型のデータがあります。 LabView7.1を使って、E8 03 という配列要素を読み出すことまではできました。 次に、この値を10進数で表現すると、いくつになれば正解なのでしょうか? (E8 03 という値をどのように計算して10進数にすればいいのでしょうか?) 私なりにプログラムした結果、-24か232のどちらかだと思うのですが自信がありません。 (データ自体が計測器が吐き出したデータなので、どのような値が入っているかわからないのです。 LabViewがビックエンディアンを使っていることも、正解に自信が持てない一因です) バイナリエディタで10進数に変換してくれるようなツールがあれば一番いいのですが。 ご存知の方がいらっしゃいましたら、ご教授ください。

  • バイナリファイルの読込み(小数の扱いについて)

    お世話になっています。 今、バイナリファイル(BSQフォーマット)を読み込むプログラムをC言語で書こうとしています。バイナリファイルの内容は数字(実数)の配列です。 そのバイナリファイルは、1数字につき2バイトしかなく、浮動小数点(float4バイトとdouble8バイト)などが使えませんでした。 なので、固定小数点なのかと思い、1バイトずつcharで読み込んだところ整数部分だけうまく読み込めました。しかし小数部分がうまくいきませんでした。 バイナリエディタで見たところ以下のようになっていました。 例:C2 FF(or 00) (この値が-62になることは分かっています。) しかし、上記の方法で読み込んだ結果は-62 -1でした。 そこで質問なのですが、 (1)2バイトの実数を1バイトで区切って整数と小数に分けて行うことなどあるのでしょうか? (2)上記の方法で行った場合、FFが-1になり、00も-1になってしまいます。本来なら小数部分のFFも00も値は0にならなければいけないのですが・・・。これは、どのように解決すればいいのでしょうか? 部分的に間違っている。根本的に間違っている。などなど アドバイスよろしくお願いします。

  • 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 どうぞよろしくお願い致します。