已经看过各种代码,其中一个人将数据读入 a char
orvoid
然后将其转换为 astruct
. 示例是解析数据具有固定偏移量的文件格式。
例子:
struct some_format {
char magic[4];
uint32_t len;
uint16_t foo;
};
struct some_format *sf = (struct some_format*) buf;
为确保这始终有效,需要struct
使用__attribute__((packed))
.
struct test {
uint8_t a;
uint8_t b;
uint32_t c;
uint8_t d[128];
} __attribute__((packed));
在读取大而复杂的文件格式时,这肯定会使事情变得简单得多。通常阅读媒体格式structs
具有 30 多个成员等的媒体格式。
它也很容易在巨大的缓冲区中读取并转换为正确的类型,例如:
struct mother {
uint8_t a;
uint8_t b;
uint32_t offset_child;
};
struct child {
...
}
m = (struct mother*) buf;
c = (struct child*) ((uint8_t*)buf + mother->offset_child);
或者:
read_big_buf(buf, 4096);
a = (struct a*) buf;
b = (struct b*) (buf + sizeof(struct a));
c = (struct c*) (buf + SOME_DEF);
...
将这样的结构快速写入文件也很容易。
我的问题是这种编码方式的好坏。我正在研究各种数据结构,并会使用最好的方法来处理这个问题。
- 这是怎么做的?(如:这是常见的做法。)
__attribute__((packed))
总是安全的吗?是不是更好用我在想什么?,谢谢@Amardeepsscanf
。- 使用强制转换和位移来启动结构的功能会更好吗?
- 等等
到目前为止,我主要在数据信息工具中使用它。就像以文件格式(例如媒体流)列出某种类型的所有结构及其值。信息转储工具。