如何在 C 中将 struct 转换为 char 数组?
How to convert struct to char array in C?
我正在尝试使用 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
来尝试其他方法,它工作正常,我的机器也在另一端接收数据包。我只是想让它更通用,因为有一堆命令,每个命令的结构最适合。谢谢。
protocol buffer我已经这样做过了,你可以看看:https://www.google.com.vn/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=protocol+buffer&*.
编辑:这种方式称为序列化数据,因为您将数据序列化为原型文件,然后将其编译为您在服务器和客户端上使用的数据包文件。
尝试使用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;
}
重要:注意数据类型编号写入缓冲区的顺序。此外,有必要检查数据是否对齐到结构中,以避免在使用时出现额外字节 memcpy
。在这里你可以查看这个主题:
对于微软:
https://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx
https://msdn.microsoft.com/en-us/library/83ythb65.aspx
对于 Gcc:
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html
我正在尝试使用 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
来尝试其他方法,它工作正常,我的机器也在另一端接收数据包。我只是想让它更通用,因为有一堆命令,每个命令的结构最适合。谢谢。
protocol buffer我已经这样做过了,你可以看看:https://www.google.com.vn/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=protocol+buffer&*.
编辑:这种方式称为序列化数据,因为您将数据序列化为原型文件,然后将其编译为您在服务器和客户端上使用的数据包文件。
尝试使用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;
}
重要:注意数据类型编号写入缓冲区的顺序。此外,有必要检查数据是否对齐到结构中,以避免在使用时出现额外字节 memcpy
。在这里你可以查看这个主题:
对于微软:
https://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx https://msdn.microsoft.com/en-us/library/83ythb65.aspx
对于 Gcc:
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html