いつもお世話になります。
今、検索について学習しているのですが、
文字列検索の場合はstrstrなどを使用すれば
検索できることは理解できました。
しかし、バイナリファイルの検索について理解できていません。
もし、バイナリ(画像や動画etc)ファイルの
中身を解析したい場合、
(1)JPEGなどのバイナリファイルを開く場合、fopen()でひらいてもいいのでしょうか?その他の方法ありますか?
(2)バイナリファイルを開いた後、バイナリファイルの
0xfffeなど指定する値の検索がしたい場合は
どのように検索したらいいのでしょうか?
関数や方法などありましたら教えてください。
どうぞよろしくお願い致します。
No.3ベストアンサー
- 回答日時:
fopen(filename, "rb") でオープンできますね(Unix系のOSなら改行などの変更はしなくていいので "r" だけでも同じでしょうけど)。
1バイトが8ビットとして、「0xfffe を検索したい」という意味が、0xff の次のアドレス位置に 0xfe があるのを見つけたいというのであれば、エラー処理は省いて書くと、
long search(FILE *fp) /* 0xff 0xfe を検索し、その位置を返す */
{
int m = 0;// マッチ状態: 0 or 1
unsigned char c;
while (fread(&c, 1, 1, fp) == 1) {
switch (c) {
case 0xff:
if (m == 0) ++m;
else m = 0;
break;
case 0xfe:
if (m == 1) return ftell(fp);
m = 0;
break;
}
}
return -1L;/* 適当に選んだ、無さそうな位置の値 */
}
でいいのではないでしょうか。通常、入出力ライブラリ内でバッファリングがされ、システムコールが fread() 呼び出しごとに呼び出されることがないので、そんなに遅くはならないでしょう。一バイト読み出すごとに fread() を呼ぶのでは関数呼び出しのオーバヘッドが大きすぎるのであれば、自分でバッファ管理するのがいいですけどね。
ただし、0xfffe など複数バイトの値の検索では、ファイルのフォーマットにもよりますが、CPUのバイトのアドレス付け順序が関係してくるかもしれませんね。たとえば、0xfffe が 16 ビット short の値であり、リトルエンディアンのCPUであったなら、0xfe を見つけてから 0xff を見つけるようにしないとなりません。もちろん、16 ビット short の値で、ファイルの内容がすべて short のバイナリ値なのであれば、fread で short の変数をバッファにして読み出して比較するだけ(逆に2つの short を跨いで比較してはいけない)ですけどね。
No.2
- 回答日時:
そのものズバリの答えは書きません。
自分で考える力をつけてもらうためのヒントだけ書きます。
(1)JPEGなどのバイナリファイルを開く場合、fopen()でひらいてもいいのでしょうか?その他の方法ありますか?
fopenを"rb"でオープンすれば問題ありません。
ただし、fgetsしないこと。
必ずfreadで読み出しましょう。
(2)バイナリファイルを開いた後、バイナリファイルの0xfffeなど指定する値の検索がしたい場合はどのように検索したらいいのでしょうか?関数や方法などありましたら教えてください。
専用の関数はありませんので、strstrに似た処理を自前でやりましょう。
unsigned char buff[256];
というバッファに読み込んだら、
for( i=0 ; i<(256-1) ; i++ ) {
if( (buff[i]==0xff) && (buff[i+1]==0xfe) ) {
// 該当する0xfffeコードが見つかった!
}
}
で1バイトづつ検査していきます。これをbuffにfreadできる限り繰り返します。
ただし、このプログラムのままでは256バイト目に0xffと257バイト目に0xfeがあるとバッファが別になってしまうので検索されません。
一括でファイル内容全部をバッファに読み込むか、プログラムの工夫が必要です。
プログラムの工夫は、1つはダブルバッファにする。もうひとつは、比較するのが2バイトだけなら2バイトのバッファを別に持ちます。
No.1
- 回答日時:
「メモリブロックどうしの比較」なら memcmp なんだけど....
JPEG なんかだと圧縮されていることも多いので, 単純に「指定したデータ」を見付けるだけでは無意味かもしれないですね.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
【お題】 ・存在しそうで存在しないモノマネ芸人の名前を教えてください
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
バイナリファイルから文字列を検索するコマンド
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
【MFC】CFileでSeekした位置か...
-
EOF
-
エラー:ストリームの終わりを...
-
EXCEL VBAで、バイナリデータの...
-
ページ読み込み時に自動的にsub...
-
EXCEL VBAでテキストファイルの...
-
PHPでMySQLのMEDIUMBLOB型のデ...
-
エクセルVBA 2千万行のCSVファ...
-
テキストデータをSQLServerに取...
-
削除したファイルの復旧、およ...
-
VBA バイナリ―から文字列にす...
-
バイナリ表示されたデータを小...
-
Microsoft VBAで2GBを超えるフ...
-
入力ファイルをバイナリにする利点
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
-
フルパスから最後のディレクト...
-
マイクラでPythonのプログラミ...
-
ファイル名の先頭にアンダース...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
EXCEL VBAでテキストファイルの...
-
エクセルVBA 2千万行のCSVファ...
-
Microsoft VBAで2GBを超えるフ...
-
EOF
-
入力ファイルをバイナリにする利点
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
【MFC】CFileでSeekした位置か...
-
ページ読み込み時に自動的にsub...
-
MacからWinにファイルを添付す...
-
24ビットのWaveデータの中身に...
-
FTPでエクセルをPUTするとファ...
-
【python】Excelファイルを読み...
-
EXCEL VBAで、バイナリデータの...
-
バイナリファイルの比較につい...
-
PHPのfgetcsvの処理容量について
-
ビットマップファイル生成(C言...
-
バイナリーデータの一部データ...
-
デバイスファイルに書き込むこと
おすすめ情報