0

バイナリ ファイルから特定の形式の構造体への読み取りに問題があります。のように、バイトごとの定義 (オフセット: 0 長さ: 2 値: 0xFF 0xD8、オフセット: 2 長さ: 2 値: 0xFF 0xE1 など) を考えると、構造を定義する方法もファイルを利用する方法もわかりませんfread() のような操作; 探している情報を正しく取り込むために。

現在、私の構造体は次のとおりです。

struct header{
    char start; //0xFF 0xD8 required.
    char app1_marker; //0xFF 0xE1 required. Make sure app0 marker (0xFF 0xE0) isn't before.
    char size_of_app1_block; //big endian
    char exif_string; //"EXIF" required
    char NULL_bytes; //0x00 0x00 required
    char endianness; //II or MM (if not II break file)
    char version_number; //42 constant
    char offset; //4 blank bytes
};

struct tag{
    char tag_identifier;
    char data_type;
    char size_of_data;
    char data;
};

構造体の各属性のバイト長が異なる (奇数) 場合、どのデータ型を使用すればよいですか? 2 バイトのスペースを必要とするものもあれば、4 バイトのスペースを必要とするものもあれば、可変長または動的な長さのものもあります。C では char は常に 1 バイトであるため、char 配列を使用することを考えていました。これは良い考えですか?

また、一度に構造全体を読み込もうとしている場合、 fread を使用する適切な方法は何でしょうか? 私はそれを残しますか:

fread(&struct_type, sizeof(char), num_of_bytes, FILE*);

この壁を乗り越えるのに役立つガイダンスがあれば、大歓迎です。私はすでに基本的な構造宣言と構造を理解しています。私が抱えている 2 つの重要な問題は、情報の分散と奇数バイト サイズ、および 1 つの fread ステートメントで可変バイト サイズを構造体に読み込む適切な方法です。

プロジェクトのリンクは次のとおりです: http://people.cs.pitt.edu/~jmisurda/teaching/cs449/2141/cs0449-2141-project1.htm

4

1 に答える 1

2

私は通常fread()、構造体のサイズとしてサイズを指定し、要素の数を として指定し、1 を返す1期待値を構造体で見ます。fread()

size_t result = fread(&record, num_of_bytes, 1, infile);

endianessフィールドがIIまたはであるかどうかをどのように判断するかはわかりませんMMが、ファイルのエンディアンがホストのエンディアンと一致するかどうかに基づいて、フィールド値を修正するかどうかを決定できると思います。

実際のデータはtag構造体のようで、最後のフィールドdataは実際には、フィールドで指定された可変長データの単なるプレースホルダーですsize_of_datasizeof(struct tag) - 1したがって、最初にバイトを読み取り、次にさらにバイトを読み取ると思いますsize_of_data

struct tag taghdr;
size_t result = fread(&taghdr, sizeof(taghdr) - 1, 1, infile);
if (result != 1) { /* ...handle error */ }
struct tag *tagdata = malloc(sizeof(taghdr) + taghdr.size_of_data - 1);
if (tagdata == 0) { /*...no more memory */ }
memcpy(tagdata, &taghdr, sizeof(taghdr) - 1);
if (taghdr.size_of_data > 0) {
    result = fread(&tagdata->data, taghdr.size_of_data, 1, infile);
    if (result != 1) { /*...handle error */ }
}
于 2013-09-26T23:40:12.863 に答える