__le32等效于24位结构

时间:2013-08-23 11:20:27

标签: c linux struct linux-kernel

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

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

2 个答案:

答案 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 *);

希望这有帮助。