- ベストアンサー
バイナリデータからの値の取得方法とは?
- バイナリデータから値を取り出す方法について教えてください。
- リトルエンディアンで格納されているバイナリデータの処理方法を教えてください。
- 指定された構造体から値を取得する方法について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> Cで書きかたいのですが。ご存知でしょうか? #include <stdio.h> int main() { /* かき */ { char data[] = "RIFF\x78\x56\x34\x12"; FILE* fp; fp = fopen("test.bin", "wb"); fwrite(data,16,1,fp); fclose(fp); } /* よみ */ { char data[5]; int n; FILE* fp; fp = fopen("test.bin","rb"); fread(data,4,1,fp); data[4] = '\0'; fread(&n,4,1,fp); printf("[%s] %x\n", data, n); fclose(fp); } return 0; }
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
バイト単位で読み込んで適当に変換すればいいのでは? まさか「リトルエンディアンが分からない」とかいうことはありえないよね.
お礼
少し頑張ってみます。
- saijyo_739
- ベストアンサー率53% (119/222)
> (1)バイナリデータにはリトルエンディアンで格納していると書いています。 > まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか? Intel 86系CPU(8086, 80n86, Pentium xxx, Celeron xxx, Core xxx,etc)はリトルエンディアンです。 リトルエンディアンなCPUを使う場合には普通に読めば良いです。 ※モトローラ68系のCPUはリトルエンディアンでないので上位バイトと下位バイトを入れ替える必要があります。CPUにはビッグエンディアンなCPUとリトルエンディアンなCPU, どちらにも設定できるCPUなどがあります。 > (2)バイナリデータには、 > はじめに文字列(char)型4バイトで「RIFF]という値 > 次に32ビット符号なし整数で4バイトの数字、 > 次に4052バイトの構造体 > などと収納されているようです。 > このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか? tarコマンドのソースを参考にしては。 #include <stdio.h> typedef struct { char riffmark[4]; unsigned int uintval; char structdata[4052]; } riffdata; int main( void ) { FILE *fp; int result; union { char buff[4096]; riffdata rdata; } readdata; fp = fopen( "sample.riff", "r" ); result = fread( readdata.buff, 4+sizeof(unsigned int)+4052,1 , fp ); fclose(fp); return 0; } こんな感じで、 readdata.rdata.riffmark[]に'R' 'I' 'F' 'F'が、readdata.rdata.uintvalにRIFFの次のunsigned int値が、readdata.rdata.structdata[4052]にその後の4052バイトが読めると思いますよ。 char structdata[4052]の部分適切に構造体でも定義してやればその構造体の形で読めるかと。
お礼
ありがとうございます。 今、参考にさせていただきながら、書いています。 返信遅れてすみませんでした。
- samtomsan
- ベストアンサー率55% (1060/1897)
> リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか お使いのCPU(言語)はリトルエンディアンですか、ビッグエンディアンですか。 リトルエンディアンであれば書かれている形式に合った変数で読むだけです。例えば、 > 32ビット符号なし整数で4バイトの数字 なら、unsigned int (32bit)の変数で読みます。intで読むと負の数になってしまう場合があります。 構造体もその構造にあった変数で読みます。 (ただし、バイナリデータをバイナリエディタで確認しておいた方が良いと思います。4バイトの文字列がほんとに4バイトだけなのか、先頭に1バイトの文字数が入っていないかとか、1文字が4バイト(後ろは3バイトのゼロ)で書き込まれていないかとか。) ビッグエンディアンの場合は、バイトの順を逆にする必要があります。 文字は(書き方によりますが)順を逆にしなくも大丈夫だと思いますが、整数や実数はバイト列を逆にする必要があります。 リトルエンディアンとビッグエンディアンの変換は、「リトルエンディアン ビッグエンディアン」で検索すれば例題が多く見つかりますから、検索してみてください。
お礼
ありがとうございます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
(1) リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか? エンディアンが異なる場合、適宜反転すること。 (2) 例: 4byteの文字列、続いて4byte-intを読む(C++) #include <fstream> #include <iostream> #include <string> using namespace std; int main() { // かき { char data[] = "RIFF\x78\x56\x34\x12"; ofstream stream("test.bin", ios::binary); stream.write(data,16); } // よみ { char data[4]; ifstream stream("test.bin"); stream.read(data,4); string head(data,data+4); cout << head << endl; int n; stream.read(reinterpret_cast<char*>(&n),4); cout << hex << n << endl; } }
お礼
ありがとうございます。すみません、できれば、Cで書きかたいのですが。ご存知でしょうか?
お礼
ありがとうございます。