【发布时间】:2011-10-07 14:37:36
【问题描述】:
我见过一些关于结构字节序的问题和答案,但它们是关于检测系统的字节序,或在两种不同的字节序之间转换数据。
不过,如果有一种方法可以强制给定结构的特定字节序,我现在想做什么。除了用大量操作位域的宏重写整个事情之外,还有一些好的编译器指令或其他简单的解决方案吗?
一般的解决方案会很好,但我也会对特定的 gcc 解决方案感到满意。
编辑:
感谢所有 cmets 指出为什么强制执行字节顺序不是一个好主意,但就我而言,这正是我所需要的。
大量数据由特定处理器生成(它永远不会改变,它是具有定制硬件的嵌入式系统),并且必须由运行在未知处理器。数据的逐字节评估会非常麻烦,因为它由数百种不同类型的结构组成,这些结构又大又深:其中大多数内部都有许多其他巨大的结构层。
更改嵌入式处理器的软件是不可能的。源代码可用,这就是为什么我打算使用该系统中的结构,而不是从头开始并逐字节评估所有数据。
这就是为什么我需要告诉编译器它应该使用哪种字节序,不管它的效率如何。
不一定是真正的字节序变化。即使它只是一个接口,并且物理上一切都以处理器自己的字节序处理,我完全可以接受。
【问题讨论】:
-
我看不出这有什么意义?您唯一关心的是在编组和解组数据时-所有其他实例,您将需要特定于平台的字节序-那么为什么要为给定结构的所有用途强制使用复杂的转换方案呢?为什么不将其完全隔离到编组/解组位?
-
字节序不是结构的属性,而是运行代码的架构的属性。虽然理论上您可以强制内存中的表示为给定的字节序,但这将强制在所有读取和写入每个字段的所有字段中从平台转换为结构字节序,以获取从外部不可观察的内容。您应该只在处理外部世界时转换格式。
-
@Nim:我从嵌入式系统中读取了大量数据,该系统具有数百个不同的结构,其中许多内部具有其他巨大结构的深层。因为我有嵌入式系统的源代码,所以我有所有这些结构的代码。这就是为什么只使用它们会更容易的原因,因为按字节读取和评估数据需要很长时间。数据的大小和不同结构的数量巨大,所以最好避免转换。
-
@David:我与外界打交道。我知道强制字节顺序不是最干净的事情,但在这种特定情况下,使用这种特定硬件正是我所需要的。
-
好问题。有时,有一个属性来指定结构和成员的字节顺序会非常好。类似于:
__attribute__ ((endianness (BIG_ENDIAN)))用于 gcc。许多网络协议使用 bigendian(=网络字节序)。所以协议源有很多ntohs()、htonl()等调用来进行转换。如果结构中有位字段,那么代码会更难看(参见“netinet/ip.h”中的struct ip)。
标签: c++ c endianness low-level