1

我有一个函数 UartSend() 通过 uart 将数据发送到网络。它需要参数 unsigned char 和一个整数

UartSend(unsigned char *psend_data,int length);

我想通过这个函数发送一个结构

#pragma pack(push, 1)
struct packet
{

    int a;
    char b[3];
    ...

}PacketData;

#pragma pack(pop)

如何将此结构转换为无符号字符以通过 UartSend 发送此数据?谢谢..

4

5 回答 5

5

unsigned char *只要您的尺寸正确,您就可以简单地转换为:

PacketData pkt;
UartSend((unsigned char *)&pkt, sizeof(pkt));

unsigned char *在这种情况下,实际上只意味着字节。

当然,在连接的另一端,您需要合并程序逻辑以重新转换为PacketData(或一些类似的结构)。

编辑:但是,请注意,正如@WhozCraig 在评论中指出的那样,如果您的目标平台与源平台不同,则需要考虑对齐问题(或者,依赖 GNU 扩展,例如__packed__

于 2013-02-22T07:48:09.697 回答
0

您可以使用联合以结构或无符号字符数组的形式访问数据。通过这种方式,您可以避免直接转换时遇到的混叠问题。

于 2013-02-22T07:57:11.560 回答
0

结构中可以有额外的字节以使每个元素对齐。这些额外的字节可能因所使用的编译器/平台而异。结果,你想做的事情可能做不到。

我建议您编写一个函数来执行此操作。它需要将每个元素拉出结构并单独发送。需要第二个函数来接收值,并将它们存储回函数中。

请记住,字节也可能是一个问题,并使用网络字节排序函数确保整数值以标准格式发送。如果系统是不同的类型,浮点值可能需要某种额外的转换步骤。

于 2013-02-22T08:01:35.617 回答
0

尖端

  1. 字节对齐/打包一个。推荐使用自然字节对齐,确保获得最佳性能。SUN 和 AIX“自然字节对齐”敏感。
  2. 字节序列转换,通常发送方以大端序发送,接收方将 BYTES 转换为本地端序。小(WINDOWS、LINUX)/大(AIX、SUN、HP)
于 2013-02-22T08:47:36.697 回答
0

您的数据结构已对齐,以便您的 int 落在字边界上,对于您的目标,这可能是 32 位或 64 位。

您可以像这样重新组织您的结构,这样就不会发生这种情况: struct thestruct

{
 int var6;
 unsigned char var1;
 unsigned char var2;
 unsigned char var3[2];
 unsigned char var4;
 unsigned char var5[8];
 unsigned char var7[4];
};
于 2015-12-02T04:53:20.290 回答