我应该使用位字段来映射传入的串行数据吗?
不会。位域有很多实现指定的行为,这使得使用它们成为一场噩梦。
无论字节序如何,data1 是否始终按预期表示正确的值。
是的,但那是因为uint8_t
是最小的可能寻址单元:字节。对于较大的数据类型,您需要注意字节顺序。
难道data2和reserved是错误的方式,data2代表高4位而不是低4位?
是的。它们也可以位于不同的字节上。另外,编译器不必支持uint8_t
对于位域,即使它会支持该类型。
位字节顺序(通常)是否取决于字节字节顺序,或者它们可以完全不同吗?
最低有效位总是在最低有效字节中,但在 C 中无法确定where该位将在字节中。
位移运算符提供了足够好的顺序的可靠抽象:对于数据类型uint8_t
the (1u << 0)
总是最不重要的并且(1u << 7)
对于所有编译器和所有体系结构来说,最重要的位。
另一方面,位字段的定义非常糟糕,以至于您无法通过定义字段的顺序来确定位的顺序。
位字节顺序是由硬件还是编译器决定的?
编译器决定数据类型如何映射到实际位,但硬件对其影响很大。对于位字段,同一硬件的两个不同编译器可以按不同的顺序放置字段。
是否有一种简单的方法可以在编译器中确定它的方式,并在需要时保留位字段条目?
并不真地。如果可能的话,这取决于您的编译器如何执行此操作。
虽然位字段是映射传入数据的最简洁的代码方式,但我想我只是想知道放弃它们并使用类似的东西是否更安全:
绝对放弃位字段,但我也建议为此目的完全放弃结构,因为:
相反,我建议手动执行此操作。定义字节数组,然后在必要时使用位移位和掩码将每个字段分开,手动将每个字段写入其中。您可以为基本数据类型编写简单的可重用转换函数。