【问题标题】:__le32 equivalent for 24 bits structure__le32 等效于 24 位结构
【发布时间】:2013-08-23 11:20:27
【问题描述】:

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

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

【问题讨论】:

  • 在标准机器上,没有任何指令处理 24 位数据。所以它必须是一个组合类型。你能给出你的属性的类型吗?

标签: c linux struct linux-kernel


【解决方案1】:

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

【讨论】:

  • 或者更好的是,使用人类可读的格式,例如(健全的)CSV 或 JSON。
  • 在那种情况下我会使用 32 位,对吧?我需要节省每个字节,因为空间有限。
【解决方案2】:

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多