C语言中如何将2个结构体拼成一个包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中如何将2个结构体拼成一个包相关的知识,希望对你有一定的参考价值。

在做聊天程序的时候用send(socket,buff,sizeof(buff),0)发送数据时,我需要发送2个结构体,也就是把两个结构体拼成buff,请问各位高手,我该怎么拼。比如这里有2个结构体:
struct msg_pack

char cmd;
char status;
short int len;
head;

struct message

char a[1024];
b;

我要把这个2个结构体拼在字符串buff中,如何实现啊?

memcpy原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域。 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。 可以拿它拷贝任何数据类型的对象。 例:char a[10],b[5]; memcpy(b, a, sizeof(b)); /*注意如果用sizeof(a),会造成b的内存地址溢出 参考技术A 你这个char buff应该是1024 + 1 + 1 + 2 个空间大小。
你这两个结构体中需要特殊处理的是short int len,因为它占两个字节(大部分是这样,不知道你的机器占多少个字节)把那个short int len进行位操作,变成两个字符(的ASC码)。
你也可以把short int len直接用itoa()变成一个字符串,但这样的话这个字符串的长度是不确定的。
然后你再用strcpy,把结构体中字符copy过去,或者直接把字符给你所定义的buf.
// 动态申请内存
...
*buf = msg_pack1.cmd;
*(buf + 1)= msg_pack1.status;
*(buf + 2)= (你通过len转换过来的第一个字符)
*(buf + 3)= (你通过len转换过来的第二个字符)

// 复制message 中的1024个字符
strcpy(buf + 4, message1.a)

这样的话就行了,转换len的时候也可以用itoa,获得的字符串,进行转换。不同的是你申请buf的大小不一样。
参考技术B memcpy就可以了

struct message msg;
struct msg_pack head;

char buffer[max_size];//max_size needs to be constant

memcpy(buffer, &head, sizeof(struct msg_pack) );
memcpy(buffer+sizeof(struct msg_pack), &msg, sizeof(struct message) );本回答被提问者采纳
参考技术C #pragma pack(push,1)
head h;
b lb;
//h初始化
//lb初始化
send(&h,sizeof(h)+sizeof(lb),...)
#pragma pack(pop)

以上是关于C语言中如何将2个结构体拼成一个包的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何实现结构体的深度复制

c语言中如何修改储存在文件的结构体内容中。小文件

c语言结构体数组赋值问题 如果用同一个结构体定义了2个不同的数组1和数组2。可以 数组1=数组2;

C语言中如何将16位结构体定义为4位和12位两部分

C语言,请问如何将结构体中的结构体拷贝到内存

c语言如何给结构体指针赋值?