gpt4 book ai didi

c - C语言中如何将结构体转换为字符数组?

转载 作者:行者123 更新时间:2023-11-30 18:15:00 26 4
gpt4 key购买 nike

我正在尝试在 C Linux 中使用 RAW 套接字发送以太网数据包。我的代码中有以下 struct 定义:

typedef struct vlink_header_s
{
uint8_t verCmd;
uint8_t reverseVerCmd;
}vlink_header_t;

typedef struct vlink_reg_rd_s
{
vlink_header_t header;
uint32_t address;
uint16_t length;
}vlink_reg_rd_t;

main中我创建了一个结构:

vlink_reg_rd_t g_pkt;
g_pkt.header.verCmd = 0x10|VLINK_CMD_REG_RD;
g_pkt.header.reverseVerCmd = ~(g_pkt.header.verCmd);
g_pkt.address = 0x0007 .....

和消息:

char sendbuf[1024];
struct ether_header *eh = (struct ether_header *) sendbuf;

如何将结构 g_pkt 中的所有信息添加到 ether_header 之后的 sendbuf 中,以便我可以使用以下方式发送完整的数据包:

sendto(sockfd, sendbuf, txLen, 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll));

我的代码中的其他所有内容都正常工作,我尝试了其他方法,将信息逐一添加到 sendbuf 中,它工作正常,我的机器也收到了另一侧的数据包。我只是想让它更加通用,因为有很多命令和每个命令的结构将最有效地工作。谢谢。

最佳答案

尝试使用memcpy函数:

#include<iostream>

typedef struct vlink_header_s
{
uint8_t verCmd;
uint8_t reverseVerCmd;
}vlink_header_t;

typedef struct vlink_reg_rd_s
{
vlink_header_s header;
uint32_t address;
uint16_t length;
}vlink_reg_rd_t;

using namespace std;
int main()
{
vlink_reg_rd_t data;

//TODO: Set values into typedef data.

int size = sizeof(vlink_reg_rd_t); //get

char* buffer = new char[size];
memset(buffer, 0x00, size);

memcpy(buffer, &data, size); //Copy data from vlink_reg_rd_t to char*

//TODO: Send the buffer.

delete[] buffer; //free memory

return 0;
}

重要:请注意数据类型 number 写入缓冲区的顺序。另外,有必要检查数据与结构的对齐情况,以避免在使用memcpy时产生额外的字节。您可以在这里查看该主题:

对于微软:

https://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx https://msdn.microsoft.com/en-us/library/83ythb65.aspx

对于海湾合作委员会:

https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html

关于c - C语言中如何将结构体转换为字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43220074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com