0

Linux 在types.h中识别小端 32 位类型。我必须将磁盘数据结构编写为 C 结构,但其中一个属性是 24 位。我如何在同一行上表示它?

Linux 有 __le32 和 __le64,但没有其他大小。

4

2 回答 2

2

使用最接近的较大类型,即__le32,然后单独写出字节。您永远不应该一次编写整个结构,因为编译器可以(并且将)添加填充,这将随编译器和架构而变化。每个字段都应作为一个单元写入文件,以便您知道输出文件中每个字节的确切用途。

于 2013-08-23T11:29:42.527 回答
1

一种方法是使用两种不同的类型:一种用于内存表示和操作,另一种用于磁盘格式。内存版本使用对您方便的简单类型(例如 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 *);

希望这可以帮助。

于 2013-08-23T12:23:04.517 回答