今、バイナリデータから値を取りだそうとがんばっています。
しかし、うまくいかずに困っています。
困っていることは2点あります。

(1)バイナリデータにはリトルエンディアンで格納していると書いています。
まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか?

(2)バイナリデータには、
はじめに文字列(char)型4バイトで「RIFF]という値
次に32ビット符号なし整数で4バイトの数字、
次に4052バイトの構造体
などと収納されているようです。
このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか?

全然できなくて困っています。
教えていただけないでしょうか?
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/05/04 20:55

バイト単位で読み込んで適当に変換すればいいのでは?



まさか「リトルエンディアンが分からない」とかいうことはありえないよね.
    • good
    • 0
この回答へのお礼

少し頑張ってみます。

お礼日時:2011/05/04 20:55

> (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]の部分適切に構造体でも定義してやればその構造体の形で読めるかと。
    • good
    • 0
この回答へのお礼

ありがとうございます。
今、参考にさせていただきながら、書いています。

返信遅れてすみませんでした。

お礼日時:2011/05/04 20:57

> リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか



お使いのCPU(言語)はリトルエンディアンですか、ビッグエンディアンですか。

リトルエンディアンであれば書かれている形式に合った変数で読むだけです。例えば、

> 32ビット符号なし整数で4バイトの数字

なら、unsigned int (32bit)の変数で読みます。intで読むと負の数になってしまう場合があります。

構造体もその構造にあった変数で読みます。

(ただし、バイナリデータをバイナリエディタで確認しておいた方が良いと思います。4バイトの文字列がほんとに4バイトだけなのか、先頭に1バイトの文字数が入っていないかとか、1文字が4バイト(後ろは3バイトのゼロ)で書き込まれていないかとか。)

ビッグエンディアンの場合は、バイトの順を逆にする必要があります。

文字は(書き方によりますが)順を逆にしなくも大丈夫だと思いますが、整数や実数はバイト列を逆にする必要があります。

リトルエンディアンとビッグエンディアンの変換は、「リトルエンディアン ビッグエンディアン」で検索すれば例題が多く見つかりますから、検索してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/05/04 20:56

(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;
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます。すみません、できれば、Cで書きかたいのですが。ご存知でしょうか?

お礼日時:2011/04/24 12:46

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVisual C++ 6.0とVisual C++ 2005 についてですが・・・

Visual C++ 6.0でワークスペースと呼ばれていた物がVisual C++ 2005になるとソリューションと言う名前になったと聞きました。
また、Visual C++ 6.0で製作したファイルはVisual C++ 2005でも開けるけどVisual C++ 2005製作したファイルはVisual C++ 6.0では開けないと聞いたのですがVisual C++ 2005製作したファイルをVisual C++ 6.0でも開ける様に互換性を持たせる方法はありませんか?
学校と家で使っている環境が違うので互換性がもてれば両方で使えてとても便利になります。
御存知の方がいましたら御伝授お願いします。

Aベストアンサー

ソースファイルやヘッダファイル(拡張子CPP/C/H/HPPなど)はVisual C++ 6.0と2005で共用できるので、6.0用のプロジェクトファイル&ワークスペースと、2005用のプロジェクトファイル&ソリューションファイルを用意すれば両方の環境で開発を進めることができるでしょう。

但し、以下の点にご注意下さい。
・ソースファイルの追加や削除は両方のプロジェクトに対して行うこと。
・Visual C++6.0ではManaged C++が使えないのでManaged C++は使わないこと。
・MFCの仕様がだいぶ違うので、MFCも避けること。MFCを知り尽くしているのでしたらチャレンジはご自由に。
・C++コンパイラとしても若干仕様が違うので(for文内で定義された変数のスコープなど)、常に両方の環境でコンパイルできるか考えながら開発する必要があること。

Qls -l コマンドの結果から月の値だけを取りだしたい

皆さん、お手数ですが教えて下さい。

今Linux上で動作させるC言語のプログラミング作業を行っているのですが、その過程において以下のコマンドラインから”月”の数値を取り出したいと思っています。
(sprintfで編集したコマンドをsystemコマンドで。)

> ls -l test_11.c
-rw-rw-r-- 1 user1 group 5431 9月 25 18:02 test_11.c


以上の表示結果から、lsコマンドとawkコマンドを組み合わせて、月の数値を取り出したいのですが、
この例で言うと、月の部分には”9月”と全角の「月」という文字が付いてきます。

取り出したいのは「9」の値だけなのです。

上手くこの月の数値だけを取り出すオプションとか無いでしょうか?

もちろん、複数のコマンドをパイプで繋げるのは一向に構いません。

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

Aベストアンサー

「C言語からlsコマンドを呼び出しても良い」という条件で開発するのなら、「C言語からfindコマンドを呼び出しても良い」筈ですよね。
だとしたら、C言語プログラムではreaddirもstatも行う必要はありません。

対象となりファイルリストはfindが作ってくれるので
popen()
して
char filename[MAXPATHLEN+1];

while(gets(filename)) {
do_something(filename);
}
というシンプルなプログラムで済みます。

QCかC++どちらを覚えるべきですか?

初めまして。せいじと申します。よろしくお願いします。
プログラミング経験なしです。今30歳です。
遅すぎますが、これからC言語かC++言語をマスターしたいと思っています。
Windows 98 + Borland C++ Compiler 5.5
で勉強しようと思ってます。

Cの拡張されたものがC++だからC++を覚えようと思って、C++の本を買いました。
・新C++言語入門 ビギナー編 SOFTBANK Publishing 林 晴比古 著
・詳説C++             SOFTBANK Publishing 大城 正典 著
2冊ともまだ最初の方を読んで実践しただけです。

クラス、オブジェクト指向プログラミング等々が何なのか分かっていないのに、
C++をする意味があるのか、まずはCで十分ではないのか?
と思うようになってきました。

実際どうしたら良いのでしょう。
何も知らないならC++からでも良いのでしょうか。
違いが分からないならCで十分なのでしょうか。
みなさんの意見を聞かせてください。

よろしくお願いします。

初めまして。せいじと申します。よろしくお願いします。
プログラミング経験なしです。今30歳です。
遅すぎますが、これからC言語かC++言語をマスターしたいと思っています。
Windows 98 + Borland C++ Compiler 5.5
で勉強しようと思ってます。

Cの拡張されたものがC++だからC++を覚えようと思って、C++の本を買いました。
・新C++言語入門 ビギナー編 SOFTBANK Publishing 林 晴比古 著
・詳説C++             SOFTBANK Publishing 大城 正典 著
2冊ともまだ最初の方を読んで実...続きを読む

Aベストアンサー

seiji-h さん。こんにちわ。
プログラミングを今後主に何の目的で使いますか?

(1)仕事でC++が必要。
 頑張っておぼえましょう。

(2)文書データの加工など。。。
 今すぐPerl言語に切り替えましょう。

(3)趣味でWindowsアプリなどの作成を目指して。。
 そのままコツコツC++を続けていってください。

(4)歯ごたえのあるプログラミング言語を。。。
 そのままコツコツC++を続けていってください。

>実際どうしたら良いのでしょう。
>何も知らないならC++からでも良いのでしょうか。
どのようなことに興味をおぼえるかで、Cから始めるべきか、C++から始めるべきか
向き不向きがあります。

★簡潔な文法をもとに、ガリガリと自分の思うままに、プログラミングしたい。
とにかく自分で動くものを作りたいということなら、Cから始めるのが向いていると思われます。
★プログラミングすることよりも、プログラミング言語「自体」に興味があって、
一種の研究の対象と考えている場合は、C++の方が、おもしろおかしく学べると思います。

seiji-h さん。こんにちわ。
プログラミングを今後主に何の目的で使いますか?

(1)仕事でC++が必要。
 頑張っておぼえましょう。

(2)文書データの加工など。。。
 今すぐPerl言語に切り替えましょう。

(3)趣味でWindowsアプリなどの作成を目指して。。
 そのままコツコツC++を続けていってください。

(4)歯ごたえのあるプログラミング言語を。。。
 そのままコツコツC++を続けていってください。

>実際どうしたら良いのでしょう。
>何も知らないならC++からでも良いのでしょうか。
...続きを読む

Qバイナリデータ処理

VC++6.0初心者です。
バイナリファイルの加工を行いたいのですが、テキスト系のプログラムしか作ったことが無いのでどうすればよいのか分かりません。

やりたいことは、
1、バイナリファイルを開いて2バイトずつ読み込む。
2、"FFD8"がきたら別ファイルにコピー開始。
3、"FFD9"がきたらコピー終了。
です。

大まかな手順がわかりません。
普段、テキストですとCStdioFileを使っていますが、これを使って開いてもよいのかどうかも分かりません(いろいろ調べはしましたがわかりませんでした)。

解決の手がかりやヒントをお教えいただければと思います。よろしくお願いいたします。

Aベストアンサー

確認してません。動かないかも。
エラーチェックも省いてます。
void CHoge::Hoge(LPCTSTR szInFileName, LPCTSTR szOutFileName)
{
  CStudioFile fiHoge;
  CWordArray wArray;
  WORD wBuffer = 0;
  BOOL bCopy = FALSE;
  int nCount = 0;

  wArray.RemoveAll();

  fiHoge.Open(szInFileName, CFile::modeRead | CFile::typeBinary);
  while(1)
  {
    if(fiHoge.Read(&wBuffer, sizeof(WORD)) < sizeof(WORD))
    {
      break;
    }

    if(bCopy == FALSE && wBuffer == 0xFFD8)
    {
      bCopy = TRUE;
    }
    else if(bCopy != FALSE && wBuffer == 0xFFD9)
    {
      bCopy = FALSE;
    }
    else if(bCopy != FALSE)
    {
      wArray.Add(wBuffer);
    }
  }
  fiHoge.Close();

  fiHoge.Open(szOutFileName, CFile::modeWrite | CFile::typeBinary);
  for(nCount = 0 ; nCount < wArray.GetSize() ; wArray++)
  {
    fiHoge.Write(wArray.GetAt(nCount), sizeof(WORD);
  }
  fiHoge.Close();
}

確認してません。動かないかも。
エラーチェックも省いてます。
void CHoge::Hoge(LPCTSTR szInFileName, LPCTSTR szOutFileName)
{
  CStudioFile fiHoge;
  CWordArray wArray;
  WORD wBuffer = 0;
  BOOL bCopy = FALSE;
  int nCount = 0;

  wArray.RemoveAll();

  fiHoge.Open(szInFileName, CFile::modeRead | CFile::typeBinary);
  while(1)
  {
    if(fiHoge.Read(&wBuffer, sizeof(WORD)) < sizeof(WORD))
    {
      break;
    }

  ...続きを読む

QVisual C++を使用するには,C++の知識は必要?

Visual C++ を使用する必要が生じたのですが,C言語の知識しかなく,
VC++を使用するにあたり,新たにC++を勉強しなければならないか分かりません。
C++を勉強してから,VC++を勉強し始めるべきなのでしょうか?
また,もしC++の勉強をしなければならない場合,使用する参考書として「独習C++」を考えているのですが,この参考書で事足りるでしょうか?
回答よろしくお願いします。

Aベストアンサー

ANo.1の方に同感です。

私はMS-DOSでのC言語からVC++へジャンプしました。

VC++を理解するということは
 1.C++という言語
 2.windowsOS,API
 3.MFC
を理解するということです。

私のとっかかりの本は、3冊のシリーズで
 1.Windowsプログラミングについて
 2.C++について
 3.MFCについて(だった思う)
に分かれており、C言語の知識とwindowsのアプリを触った経験があれば順を追って素直に理解できるものでした。
#処分してしまったので正しい書籍名はわかりませんが、クリーム色のカバーでした。

ただ、これはあくまで入門書で、その後C++に関する本、MFCに関する本、WIN32APIに関する何冊か読まないと、やはり仕事はできません。

Qc言語 正負の値それぞれでの最大値最小値

大学の研究で使うデータ処理で困っています。
Microsoft Visual C++ 2008 Express Editionを使っています。

例えば、10個の値が縦一列に入ったtxtファイルがいくつかあったとして
-5,-3,-2,0,3,4,5,6,7,8,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は8、最小は3)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大は-2、最小は-5)
結果として表示される

0,1,2,3,4,5,6,7,8,9,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は9、最小は1)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
結果として表示される

0,0,0,0,0,0,0,0,0,0
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
結果として表示される


といったプログラムを作成したいです。教えてください!

大学の研究で使うデータ処理で困っています。
Microsoft Visual C++ 2008 Express Editionを使っています。

例えば、10個の値が縦一列に入ったtxtファイルがいくつかあったとして
-5,-3,-2,0,3,4,5,6,7,8,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は8、最小は3)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大は-2、最小は-5)
結果として表示される

0,1,2,3,4,5,6,7,8,9,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は9、最小は1)...続きを読む

Aベストアンサー

本当に研究で使うデータ処理なのかなぁ?
こんな単純なデータ処理をして結果を表示するだけなんて研究に使うとは思えない。
むしろ課題を丸投げにしているように見える。

数値が縦一列に入っているということは各数値は改行で区切られているのだから、
ファイルをオープンして一行づつデータを読み取りながら、その数値の正負零を判定し、
(零を除いて)正負それぞれの最大最小を順次残していくようにすればよい。
最後に、残った最大最小の値を表示または非存在を表示する。
大した処理ではないと思われますが。。。

もしC言語が苦手だというのであれば、Excelなどの表計算ソフトのマクロで行っても
たいしたことは無いでしょう。

QC/C++でアプリ開発

C/C++でアプリ開発

いまどきC++でアプリ開発なんてしないのででしょうか。
C/C++を使うのは組み込み分野とかぐらいなんでしょうか?
もし新卒の大学生がC/C++でアプリ開発するならどういう会社に入ればよいでしょうか?

Aベストアンサー

ソフトウェアハウスとかなら今でもC言語が必要になる案件は多いです
Windows向けソフトウェアの受託とか、Linuxアプリケーションとか。

ただ、C言語でそれなりの結果を出している
というわけでは無いのでしたら、
無理してC言語にこだわらない方がいいかもしれません。
Cで開発するだけの自信があるのでしたら、
それ以外の言語の仕事も十分に出来ますし、
そっちの方が仕事が捕まえやすいというのもあります。
それにC言語の仕様の多さは他の言語には類を見ないくらいに大きいですから、
他の言語の仕様を覚えてからでも、十分に役立たせることが出来る。

QOpenCVを使って画素の階調値を、その近傍画素の階調の最小値(最大値

OpenCVを使って画素の階調値を、その近傍画素の階調の最小値(最大値)にするフィルタを作りたいのですが、やり方がわかりません。どのたか、わかる方お願いします。

Aベストアンサー

http://opencv.jp/opencv-2svn/c/image_filtering.html#dilate
http://opencv.jp/opencv-2svn/c/image_filtering.html#erode

QC++を学習するにあたって

質問は以下の3つですよろしくお願いします

1.vc++ と c++の違いを教えてください。
 vc++は開発環境でc++の画面をプログラミングするときに使うもの
 という認識でいいでしょうか。
2.vc++とc++の開発環境を教えてください。
javaでいうeclipsの様なものまたその開発環境はcやc++やc#でも使えるか否か

3.vc++ や c++ は制御系システムで用い業務系システムでは
 利用しないのでしょうか
 
初歩的な質問で申し訳けありませんがよろしくお願いします。

Aベストアンサー

1.「VC++」とは、マイクロソフト社の「Visual C++」という製品を略したものです。「C++」だけの場合は製品名ではなく、プログラミング言語名です。別に画面特定ではないです。

2.Windows上で一番メジャーな開発環境はマイクロソフト社の「Visual Studio」ですかね。C、C++、C#すべて使えます。
「Visual C++」はVisual Studioの一部です。

3.もちろん業務系でも使われます。アプリケーションやゲームの製作にも一番使われているのではないでしょうか。

Qピクセル値の取得

C++Builderでプログラムを作っていますが、分からないことがあります。
あるbmpファイルを読み込んで、そのピクセル値を取得したいのです。
ファイルの読み込みは、
pBitmap->LoadFromFile("test.bmp");
Image1->Picture->Graphic = pBitmap;
みたいな形で表示できました。
ピクセル値の取得方法を教えて下さい。

Aベストアンサー

TCanvas の Pixels プロパティで取得できます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング