【C语言】结构体赋值、结构体转字节数组(二)

直接上代码

#include <stdio.h>

typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;

typedef struct
{
    u16 head;
    u16 id;
    u8 port;
    u8 mode;
    u16 dataLen;
    u8* data;
    u16 checkCode;
    u16 tail;
}NET_PROTOCOL_STRUCT;

void FormatVersionNumberTwoFrame(u8* pSLIPData, u32* pSLIPDataLen)
{
    u16 index = 0;
    u16 lenPos = 0;
    u16 checkPos = 0;
    u16 crc = 0xAABB;
    u8 ICDData[200];
    int i;

    NET_PROTOCOL_STRUCT net;
    net.head = 0x1122;
    net.id = 0x3344;
    net.port = 0;
    net.mode = 0x01;
    net.dataLen = sizeof(net)-4+10;//4:u8*的地址字节数 2:u8数据个数
    // 首先为 net.data 分配内存
    net.data = (unsigned char*)malloc(sizeof(unsigned char)*10);
    for (i = 0; i < 10; i++)
    {
        net.data[i] = i;
        //*(net.data + i) = i;
    }
    net.checkCode = crc;
    net.tail = 0x6677;

    memcpy(pSLIPData, &net, 8);//8:前8个字节,也就是data以前的字节,内存是连续的就能直接拷贝
    memcpy(pSLIPData + 8, net.data, 10);//8:从第8个字节开始拷入   10:data的字节大小
    // ((unsigned char*)&net):将net转成u8大小计算
    // +(sizeof(net)-4):从这里开始拷贝
    memcpy(pSLIPData + 8 + 10, ((unsigned char*)&net)+(sizeof(net)-4), 4);//18:从第18个字节开始拷入   4:最后两个u16的字节大小(内存连续可以直接拷贝)
    *pSLIPDataLen = net.dataLen;
}


int main() 
{
    unsigned char pSLIPData[1024];
    unsigned int pSLIPDataLen = 0;
    
    printf("start\n");
    FormatVersionNumberTwoFrame(pSLIPData, &pSLIPDataLen);

    printf("end\n");

    return 0;
}

解析

查看 net 内存赋值
在这里插入图片描述
这里的 f0 8f 46 01 是 u8 *data的地址。

下面才是 data 的值
在这里插入图片描述

下面就是拷贝到pSLIPData的值,可以看见是正确的。
在这里插入图片描述

关于拷贝的解析下面也写的比较清楚了。

memcpy(pSLIPData, &net, 8);

//8:前8个字节,也就是data以前的字节,内存是连续的就能直接拷贝

memcpy(pSLIPData + 8, net.data, 10);

//8:从第8个字节开始拷入 10:data的字节大小

memcpy(pSLIPData + 8 + 10, ((unsigned char*)&net)+(sizeof(net)-4), 4);

// ((unsigned char*)&net):将net转成u8单位大小计算
// +(sizeof(net)-4):从这里开始拷贝
//18:从第18个字节开始拷入 4:最后两个u16的字节大小(内存连续可以直接拷贝)

注意:

不能直接 &net + 偏移,不然偏移单位是 sizeof(net)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值