• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バイナリデータ処理)

バイナリデータ処理の初心者のための手順とヒント

このQ&Aのポイント
  • バイナリデータ処理について、VC++6.0初心者の方に対して、具体的な手順とヒントをご紹介します。
  • バイナリファイルの加工を行いたい場合、テキスト系のプログラムしか作ったことがない方でも以下の手順に従って行うことができます。
  • 具体的な手順として、バイナリファイルを開いて2バイトずつ読み込み、特定のパターンが出現した場合に別のファイルにコピーするという処理を行うことができます。

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

  • ベストアンサー
  • FAY
  • ベストアンサー率49% (95/193)
回答No.3

確認してません。動かないかも。 エラーチェックも省いてます。 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(); }

tanatetsu
質問者

お礼

何とか目的のプログラムを作る事が出来ました。 ただ、 if(bCopy == FALSE && wBuffer == 0xFFD8) のところで、"0xFFD8"だと結果がうまくいかず"0xD8FF"にしたところ何とか目的の結果になりました。これがリトルエンディアンというやつでしょうか?

tanatetsu
質問者

補足

ソースまで書いていただいてありがとうございます。 大変参考になります。 変数はWORD型を使えば、判定も簡単に出来るんですね。

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

その他の回答 (2)

  • FAY
  • ベストアンサー率49% (95/193)
回答No.2

やり方はいろいろありますが、以下はその一例です 1.まず読込元ファイルをCStdioFileを使ってバイナリモードで開きます。(CFileを使って開いてはいけません) 2.CFile::Read()で読込元ファイルのデータを2バイトずつ読み込みます。 3.読み込んだデータが0xFFD8だったらコピーを開始します。 4.コピー開始後、読み込んだデータが0xFFD9ではなかったら出力先バッファにデータをコピーします。 5.読み込んだデータが0xFFD9だったらコピーを終了します。 6.読込元ファイル終端に達するまで3~5を繰り返します。 7.読込元ファイル終端に達したら読み込み元ファイルを閉じます。 8.CStdioFileで出力先ファイルをバイナリモードで開きます。 9.出力先バッファのデータをCFile::Write()で出力先ファイルに書き込みます。 10.出力先ファイルを閉じます。 データの大きさなどにより若干やり方が変化しますがおおよそこんな感じです

tanatetsu
質問者

お礼

あ、わかりました。 while(1){ char sss[2]; if( fr.Read( sss, 2 ) == NULL ) break; else{ fw.Write( sss, 2 ); } } でいいんですね

tanatetsu
質問者

補足

ご回答ありがとうございます。 おかげで流れ図を頭の中で描くことができました。 ですが、とりあえず while(1){ char sss[2]; char ch[10]; if( readfile.Read( sss, 2 ) == NULL ) break; else{ wsprintf( ch, "%#x", sss ); writefile.Write( sss, strlen(sss) ); } } というふうにして全データを16進で書き出そうと思うですが、うまく出力されません。 よくわかりません。。

全文を見る
すると、全ての回答が全文表示されます。
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

普通にfopenで開いてfwriteで書き込んではどうでしょう? 読み込みはfreadです。

参考URL:
http://homepage3.nifty.com/mmgames/c_guide/17-02.html
tanatetsu
質問者

お礼

ご回答ありがとうございます。 参考URLも拝見しました。 FILE *fp; などと宣言して普通に2バイト読み込み、バッファを介してfwriteで書き込むということですね。

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

関連するQ&A

  • テキストファイルのデータからバイナリを作りたい

    現在、テキストデータとしてCSVファイル1つあたり8バイトのデータが1000個ほどのデータが書かれているファイルがあります。このデータをバイナリファイルへ数値も変換して行きたいと思っています。 たとえば1個目のデータ”12345678”というテキストデータをバイナリの"12345678"に変換したらそれを0x00番地に並べて、そして2個目のデータ”87654321”というデータをバイナリにしたらそれを0x90離れた場所に置いていき、それを1000回繰り返して、結果をバイナリファイルで出力したいのですが、何か簡単にできるフリーソフトなどありませんでしょうか? また、プログラムとかでも簡単にできるのならそうしたいのですが、どうしたらよいか教えていただけないでしょうか?

  • この方法でバイナリデータが読めるのでしょうか

    あるプログラムでバイナリ出力しているファイルがあります。これを単純にfread()で読み込んで、今度はfprintf()で出力すればどうなりますか?やりたいことは、バイナリ出力されたファイルをテキストファイルに変換したいのですが、この方法で、バイナリファイルが読めるでしょうか? ちなみに、読みたいバイナリファイルは、fwrite()で書き出したファイルです。 あと、「バイナリファイルです」と言って貰ったファイルを、windowsのテキストエディタなどで開くと、appleなどの通常のアルファベットの単語と、あとは訳のわからないものが見えるのですが、これってバイナリファイルじゃないですよね?appleなどと書いてあるのですから。 間違えていましたら、訂正お願いします。

  • MIMEとバイナリデータの読み方

    バイナリファイルの中、MIME boundary1の後、ヘッダーの部分のXMLで書かれたテキストファイルあります。そのXMLヘッダー文をパースしたい。 バイナリファイルのほかのところにMIME boundary2の後バイナリ形式のデータあります。 Googleで調べたけど、なにかは見つかったけど、理解できず困っています。 バイナリファイルを一バイトづつ読んで、Integer.toHexString()を使うとASCIIの形でXMLの部分はそのまま (フォーマットなしで)、バイナリデータの分は化けた表示されます。 だいたいのアウトラインでよいです。やり方ご存知の方、教えてください。 (1)boundary1の後書かれたXML式データを読む方法 (2)boundary2の後、決まったキーワードが入っていたら、そこから決まったバイト数までのバイナリデータを読む方法 その決まったキーワードと決まったバイト数はヘッダーのXML内に書かれています。

    • ベストアンサー
    • Java
  • 入力ファイルをバイナリにする利点

    CSV形式の入力ファイルをテキストではなく、バイナリのCSVに変換して利用する利点てなんでしょうか? つまり、とあるプログラムで「.csvファイル」を、エディタで開くと文字化けする「拡張子なし(または.dat)ファイル」に変換してからそれを入力ファイルとしているのですが、素人の自分から考えると、テキスト形式で作ったCSVファイルをそのまま入力ファイルにすればいいんじゃないかと思ってしまいます。 バイナリの方が読み込み、書き込みが速くなるのでしょうか? またはバイナリでないとできないことがあるのでしょうか? ポインタなどが関係しているのでしょか? ちなみにその開発環境はVC++です。

  • バイナリファイルの編集

    サイズの大きいバイナリファイルがあります。 1レコードのサイズは200バイトです。 これの6バイト目から17バイト目を抜いたファイルを 作成するプログラムを考えています。 バイナリファイルの読みんだデータは 何型に格納すればいいのかわかりません。 よろしくお願いします。

  • バイナリ出力

    バイナリのテストデータを作成しており、VBAで作成中です。 以下の内容で困っております。 「0~65525の値を2バイトの情報(VCでいうunsigned shortの型)としてバイナリファイルに出力する。」 変数long型で値を取得した場合、4バイトの情報としてバイナリ出力されてしまいます。これを2バイトの情報として出力する方法をご教授願えないでしょうか? よろしくお願いします。

  • バイナリファイルの書き出し

    バイナリファイルにデータを書き込むプログラムを作りたいと思っています。実は、Standard MIDI Fileのバイナリファイルを作りたいんです。 SMFについては、今まで、直接バイナリエディタで開き、16進数の数字をいじくって、データ書き換えたりしてたので直接バイナリファイルに16進数での数字を書きたいんです。 たとえば、テキストファイルに903C408360803C0000みたいに吐き出すプログラムでは、バイナリファイルに書き出してからバイナリエディタで開くと こいつがさらに16進数に変換されてしまいますよね? そうならないようにするにはどうやればいいんですか?

  • バイナリデータについて

    バイナリデータについて 先日関連した質問をさせていただいただのですが、 質問内容があやふやでしたのであらためて 今回POS連携システムにてPOSへ渡すデータを固定長バイナリ型式で作成いたします。 JAVAにてデータ作成を行うのですが、その作成方法がよくわかりません。 例えば次の6項目があるとして 元のデータ[0001] → 属性[K] 長さ[2Byte] 元のデータ[20100901] → 属性[K] 長さ[4Byte] 元のデータ[1234567890123456ffff] → 属性[K] 長さ[10Byte] 元のデータ[000100] → 属性[P] 長さ[3Byte] 元のデータ[0000001c] → 属性[P] 長さ[4Byte] 元のデータ[01] → 属性[B] 長さ[1Byte] 元のデータから各属性への変換、ファイル出力がイメージがわきません。 属性のK,P,Bというのもよくわかりません。 どなたかヒントでもいただけたら幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • バイナリファイルの編集

    stirling,bzなどのエディタを用いて、バイナリファイルを編集しようとしています。 テキスト(a.txt)のデータをバイナリファイルにコピペしようとしたのですが・・・ テキストで「ff ff ff ff」と書いてあったデータが、バイナリファイルにコピペすると「4646~」というように変換されてしまいました。 バイナリファイルでも「ff ff ff ff」とコピーしたい場合はどのようにすれば良いのでしょうか?

  • バイナリデータの書込みについて

    こんにちは、初めまして。 さっそくなんですが、バイナリデータの操作を行っていて、ちょっと気になることがあり、質問させて頂きます。 現在あるバイナリデータファイルの読出しには成功し、一応思った通りに書込み、 そのデータは壊れず、読み出せたんですが・・・。 そのバイナリデータファイルは当然のように、アスキー型や文字型、ビッグエンディアンのshortやlongがバイト長ごとに入り混じってます。 アスキー型や文字型は問題なく読み書きできるんですが、 ビッグエンディアンのshortやlongを書き込む時、バイト長を指定してやると、データが壊れてしまいます。 例えば、2バイトのビッグエンディアンのshortを読み出して、そのままリスト値に変換をかけ、なにも加工することなく、再びバイナリ構造体に変換しても、データが壊れてしまいます。 例 失敗) INは読み出すファイル、OUTは書き込むファイル read (IN,$dataB,2); $dataA = unpack("n2",$dataB); $dataB2 = pack("n2",$dataA); print OUT $dataB2; 現在、packするときに、データ長をしてせず、*とすることでデータの書込みには成功してる(ちゃんと読めるデータとして)んですが、これから先、こういったデータを加工して書き込む場合、データ長を指定せずに書き込むというのは・・・。ちょっと嫌な感じです。 例 成功) INは読み出すファイル、OUTは書き込むファイル read (IN,$dataB,2); $dataA = unpack("n2",$dataB); $dataB2 = pack("n*",$dataA); print OUT $dataB2; 何が原因なのか、わからず困っています。 なにぶん素人なもので、やってること自体間違っているのかもしれませんが、どなたか御回答頂ければ幸いです。 ここに書いている質問の意図がわからない等、ありましたらその旨お答え頂ければ、私の知る限りお答えしようと思いますので、どうか宜しくお願い致します。

    • ベストアンサー
    • Perl