繁体   English   中英

将C结构转换为无符号字符

[英]Convert C structure into unsigned char

我有一个函数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将这种结构转换为unsigned char以便发送此数据? 谢谢..

您可以简单地将其unsigned char *unsigned char * ,只要您的大小正确即可:

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

在这种情况下, unsigned char *实际上仅表示字节。

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

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

您可以使用并集以结构或无符号char数组的形式访问数据。 这样,您可以避免直接铸造时出现的混叠问题。

结构中可以包含额外的字节,以使每个元素对齐 这些额外的字节可能会有所不同,具体取决于所使用的编译器/平台。 因此,您可能想做的事情可能做不到。

我建议您编写一个函数来执行jo。 它需要将每个元素从结构中拉出并分别发送。 需要第二个函数来接收值,并将它们存储回该函数中。

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

提示

  1. 字节对齐/打包一个。 建议使用自然字节对齐,以确保获得最佳性能。 SUN和AIX“自然字节对齐”敏感。
  2. 字节序列转换,通常发送方使用big-endian发送,接收方将BYTES转换为本地endian。 小(WINDOWS,LINUX)/大(AIX,SUN,HP)

您的数据结构已对齐,以便您的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];
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM