c++ - 在 C++ 中更改整个结构的字节顺序

标签 c++ struct deserialization endianness

我正在用 C++ 编写解析器来解析定义明确的二进制文件。我已经声明了所有必需的结构。由于我只对特定字段感兴趣,因此在我的结构中,我通过创建大小等于跳过字节的 char 数组来跳过非必需字段。所以我只是读取 char 数组中的文件并将 char 指针转换为我的结构指针。现在的问题是该二进制文件中的所有数据字段都是大端顺序,因此在进行类型转换后我需要更改所有结构字段的字节顺序。一种方法是为每个字段手动执行此操作。但是struct种类繁多,字段很多,手动操作会很麻烦。那么实现这一目标的最佳方法是什么。由于我将解析非常大的此类文件(例如 TB 的文件),因此我需要一种快速的方法来执行此操作。

编辑:我使用了attribute(packed) 所以不用担心填充问题。

最佳答案

如果您可以进行未对齐的访问而不会受到任何惩罚,并且您不介意使用特定于编译器或平台的技巧来控制填充,那么这就可以工作。 (自从你提到 __attribute__((packed)) 后,我假设你对此没问题)。

在这种情况下,最好的方法是为您的原始数据类型编写值包装器,并在首先声明您的结构时使用它们而不是原始类型。请记住,值包装器必须是微不足道的/类似 POD 的才能起作用。如果你有 POSIX 平台,你可以使用 ntohs/ntohl对于字节序转换,无论您自己编写什么,它都可能得到更好的优化。

如果未对齐的访问在您的平台上是非法的或速度很慢,则您需要反序列化。由于我们还没有反射,您可以使用相同的值包装器(加上一个 Ignore<N> 占位符,为您不感兴趣的字段跳过 N 个字节),并在元组而不是结构中声明它们 - 你可以遍历元组中的成员并告诉每个成员从消息中反序列化自身。

关于c++ - 在 C++ 中更改整个结构的字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52062584/

相关文章:

来自变量的 C++ 数组名称

将字符串复制到结构体数组的元素

java - 从包含多个对象的序列化文件中读取数据

c++ - 如何在 B 类中定义 A 类的对象

c++ - 快速内存分配/范围问题

c++ - 海湾合作委员会ld : symbol(s) not found for architecture i386

C++ 模板类特化和结构

go - 同一结构中的多个互斥体?

c# - json 没有反序列化到类

java - jackson 奇怪的 XML 反序列化