在结构上使用memcpy时我遇到了一个问题。
考虑下面的结构
struct HEADER
{
unsigned int preamble;
unsigned char length;
unsigned char control;
unsigned int destination;
unsigned int source;
unsigned int crc;
}如果我使用memcpy将数据从接收缓冲区复制到此结构,则复制是正常的,但如果我将此结构重新声明为以下内容:
struct HEADER
{
unsigned int preamble;
unsigned char length;
struct CONTROL control;
unsigned int destination;
unsigned int source;
unsigned int crc;
}
struct CONTROL
{
unsigned dir : 1;
unsigned prm : 1;
unsigned fcb : 1;
unsigned fcb : 1;
unsigned function_code : 4;
}现在,如果我使用与以前相同的memcpy代码,则前两个变量(前同步码和长度)复制正常。控制完全混乱,最后三个变量被上移一位,也就是crc = 0,source = crc,destination = source...
ANyone对我有什么好的建议吗?
发布于 2013-10-09 19:07:23
最干净的方法是使用一个联合,比如:
struct HEADER
{
unsigned int preamble;
unsigned char length;
union {
unsigned char all;
struct CONTROL control;
} uni;
unsigned int destination;
unsigned int source;
unsigned int crc;
};然后,结构的用户可以选择他想要访问事物的方式。
struct HEADER thing = {... };
if (thing.uni.control.dir) { ...}或
#if ( !FULL_MOON ) /* Update: stacking of bits within a word appears to depend on the phase of the moon */
if (thing.uni.all & 1) { ... }
#else
if (thing.uni.all & 0x80) { ... }
#endif注意:此构造不会解决字节顺序问题,这将需要隐式转换。
Note2:而且您还必须检查编译器的位序。
还要注意,位字段不是很有用,特别是当数据通过网络传输时,并且代码预期运行在不同的平台上,具有不同的对齐方式和/或字节顺序。普通的unsigned char或uint8_t加上一些位掩码可以产生更干净的代码。例如,检查BSD或linux内核中的IP堆栈。
https://stackoverflow.com/questions/19268744
复制相似问题