首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中将结构转换为字符数组?

如何在C中将结构转换为字符数组?
EN

Stack Overflow用户
提问于 2017-04-05 00:52:28
回答 2查看 5.5K关注 0票数 0

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

代码语言:javascript
复制
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中,我创建了一个结构:

代码语言:javascript
复制
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 ..... 

和信息:

代码语言:javascript
复制
char sendbuf[1024];
struct ether_header *eh = (struct ether_header *) sendbuf;

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

代码语言:javascript
复制
sendto(sockfd, sendbuf, txLen, 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll));

代码中的其他内容都正常工作,我尝试了其他方法,一个一个地将信息添加到sendbuf中,这样可以正常工作,而我的机器也在另一边接收数据包。我只想让它变得更通用,因为每个命令都有很多命令和结构,这样才能工作得最好。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-05 21:44:18

尝试使用memcpy函数:

代码语言:javascript
复制
#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时出现额外的字节。在这里,您可以查看以下主题:

对于Microsoft:

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

票数 0
EN

Stack Overflow用户

发布于 2017-04-05 04:02:21

我已经对协议缓冲区这样做了,您可以查看:https://www.google.com.vn/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=protocol+buffer&*。

编辑:这种方法称为序列化数据,因为您将数据序列化为proto文件,然后将其编译到服务器和客户端使用的数据包文件中。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43220074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档