Linux 在types.h中识别小端 32 位类型。我必须将磁盘数据结构编写为 C 结构,但其中一个属性是 24 位。我如何在同一行上表示它?
Linux 有 __le32 和 __le64,但没有其他大小。
Linux 在types.h中识别小端 32 位类型。我必须将磁盘数据结构编写为 C 结构,但其中一个属性是 24 位。我如何在同一行上表示它?
Linux 有 __le32 和 __le64,但没有其他大小。
使用最接近的较大类型,即__le32
,然后单独写出字节。您永远不应该一次编写整个结构,因为编译器可以(并且将)添加填充,这将随编译器和架构而变化。每个字段都应作为一个单元写入文件,以便您知道输出文件中每个字节的确切用途。
一种方法是使用两种不同的类型:一种用于内存表示和操作,另一种用于磁盘格式。内存版本使用对您方便的简单类型(例如 uint32_t 用于无符号 24 位值)。磁盘表示可以使用 uint8_t 类型的数组。这当然需要转换例程(如果适用,它还会隔离小端和大端之间的任何转换)。
这是一个有点做作的示例,用于说明目的。
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 *);
希望这可以帮助。