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 个,甚至有些是可变/动态长度。我正在考虑使用 char 数组,因为 char 在 C 中始终是一个字节。这是个好主意吗?

另外,如果我试图一次读取整个结构,使用 fread 的正确方法是什么?我会把它留在:

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

任何帮助我越过这堵墙的指导将不胜感激。我已经了解了基本的结构声明和构造,我遇到的两个关键问题是信息的方差和奇数字节大小,以及在一个 fread 语句中将可变字节大小读入结构的正确方法。

这是项目链接: http: //people.cs.pitt.edu/~jmisurda/teaching/cs449/2141/cs0449-2141-project1.htm

4

1 回答 1

2

我通常fread()在结构上看到将大小指定为结构大小,将元素数指定为,以及返回 11的期望:fread()

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

我不确定您如何确定您的endianess字段是否为IIor MM,但我想这个想法是您可以根据文件字节序是否与主机字节序匹配来决定是否修复字段值。

实际数据似乎是tag结构,最后一个字段data实际上只是字段中指定的可变长度数据的占位符size_of_data。所以我猜你会先读取sizeof(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 回答