首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将memcpy用于结构

将memcpy用于结构
EN

Stack Overflow用户
提问于 2013-10-09 17:55:46
回答 5查看 2.8K关注 0票数 1

在结构上使用memcpy时我遇到了一个问题。

考虑下面的结构

代码语言:javascript
运行
复制
struct HEADER
{
    unsigned int preamble;
    unsigned char length;
    unsigned char control;
    unsigned int destination;
    unsigned int source;
    unsigned int crc;
}

如果我使用memcpy将数据从接收缓冲区复制到此结构,则复制是正常的,但如果我将此结构重新声明为以下内容:

代码语言:javascript
运行
复制
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对我有什么好的建议吗?

EN

Stack Overflow用户

发布于 2013-10-09 19:07:23

最干净的方法是使用一个联合,比如:

代码语言:javascript
运行
复制
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;
};

然后,结构的用户可以选择他想要访问事物的方式。

代码语言:javascript
运行
复制
struct HEADER thing = {... };

if (thing.uni.control.dir) { ...}

代码语言:javascript
运行
复制
#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 charuint8_t加上一些位掩码可以产生更干净的代码。例如,检查BSD或linux内核中的IP堆栈。

票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19268744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档