0

私は、現在約 20 年前の形式のレガシー バイナリ ファイルからイメージを (C# 経由で) 解析する任務を負っています。画像データはバイナリ ファイルに埋め込まれ、接頭辞として 16 進フラグが付けられます。以下は、私が探しているフラグの定義です(Cで):

#define C_THUMBNAIL    0x0008        /* thumbnail bitmap */
#define C_CTHUMBNAIL   0x000d        /* compressed thumbnail bitmap */

ファイル内でこれらのフラグの 1 つ (フラグでさえあるのでしょうか?) を見つけるにはどうすればよいですか? フラグの場所と、フラグの後の値 (画像のサイズ (バイト単位)) を読み取る方法がわかれば、必要なことを実行できます。これは私がこれまでに持っているものです:

var binReader = new BinaryReader(new FileStream(fileLocation, FileMode.Open));

//1. find flag
//2. get image size in bytes
//3. take the slice of the byte array containing the image
//4. write that slice of the array to a .png file.

私の当初の考えは、フラグが見つかるまでバイナリ ストリームをたどることでしたが、16 進フラグが数字の 8 (0x0008 == 8 ですよね?) の場合、それを見つける方法に本当に混乱しています。ファイル内の他のすべての 8 と区別します。

これが重複した質問である場合は申し訳ありませんが、この問題を解決するために何を調査すればよいかを知るのに十分な知識がありません。バイナリ ファイルに関する MSDN のドキュメントを読み、ここで同様の質問をいくつか読みましたが、それらが私の質問に答えているかどうかわかりません。

4

2 に答える 2

0

それが埋め込まれた画像データを見つける方法を持っている唯一の情報である場合、これは困難です。フラグのプレフィックスは、多くのことを意味します。先頭の 0x8 (1000 バイナリ) または 0xd (1100 バイナリ) バイトを意味する場合もありますが、ビット マスクの一部である可能性もあります。

プレフィックスとしてどのような種類のヘッダーが含まれているかについて他の情報がない場合は、すべての 0x8 または 0xd バイトを見つけて、それが画像データの開始の可能性を示していると仮定して、画像を抽出してから確認することができますそれが賢明なイメージにつながる場合。ただし、それらの数が多い可能性があります。ファイル内のデータのおおよその位置がわかっている場合は、検索を絞り込むことができる場合があります。

これには、実際の画像形式も知っている必要があるようです。そうしないと、何らかの形式のプレーンな RGB ビットマップなどでない限り、ほとんど失われます。

于 2013-08-14T22:24:05.600 に答える
0

あなたの質問は正しいです。

0x08 は 8 です。

ファイル内のフラグを単純に探すことはできません。

ファイル形式がどのように定義されているかを詳述したドキュメントを見つける必要があります。

たとえば、「tar」(圧縮ファイル形式) には、どのフラグがヘッダーのどこにあるのか、および tar ファイルを解析する方法に関する非常に具体的な情報があります。

于 2013-08-14T22:09:52.020 に答える