直接上代码
#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)