Linux在这里识别小端32位类型types.h。我要将磁盘上的数据结构写为C结构,但其中一个属性是24位。我如何在同一行上代表它?
Linux有__le32和__le64,但其他大小没有别的。
答案 0 :(得分:2)
使用最近的较大类型,即__le32
,然后单独写出字节。您永远不应该一次编写整个结构,因为编译器可以(并且将)添加填充,这将随编译器和体系结构而变化。每个字段都应该作为一个单元写入文件,以便您知道输出文件中每个字节的确切用法。
答案 1 :(得分:1)
一种方法是使用两种不同的类型:一种用于内存中表示和操作,另一种用于磁盘格式。内存中版本使用方便的简单类型(对于无符号的24位值,请使用uint32_t)。磁盘表示可以使用uint8_t类型的数组。当然需要转换例程(如果适用,它还会隔离little-endian和big-endian之间的任何转换。)
这是一个有点人为的例子,用于说明目的。
typedef struct {
uint8_t version[3];
uint8_t options[2];
uint8_t data[3];
} my_type_disk;
typedef struct { /* size of fields may diffe from disk version */
uint32_t version; /* order may be different too */
uint32_t data;
uint16_t options;
} my_type_host;
void myTypeDiskToHost (my_type_disk *, my_type_host *);
void myTypeHostToDisk (my_type_host *, my_type_disk *);
希望这有帮助。