[英]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 *
实际上仅表示字节。
当然,在连接的另一端,您需要合并程序逻辑以重新PacketData
到PacketData
(或某些类似的结构)。
编辑:但是,请注意,正如@WhozCraig在注释中指出的那样,如果目标平台与源平台不同,则需要考虑对齐问题(或者,依赖于__packed__
类的GNU扩展)
您可以使用并集以结构或无符号char数组的形式访问数据。 这样,您可以避免直接铸造时出现的混叠问题。
结构中可以包含额外的字节,以使每个元素对齐 。 这些额外的字节可能会有所不同,具体取决于所使用的编译器/平台。 因此,您可能想做的事情可能做不到。
我建议您编写一个函数来执行jo。 它需要将每个元素从结构中拉出并分别发送。 需要第二个函数来接收值,并将它们存储回该函数中。
请记住, endianism可能是一个问题为好,并使用网络字节顺序的功能 ,以确保整数值在标准格式发送。 如果系统类型不同,则浮点值可能需要某种额外的转换步骤。
提示
- 字节对齐/打包一个。 建议使用自然字节对齐,以确保获得最佳性能。 SUN和AIX对“自然字节对齐”敏感。
- 字节序列转换,通常发送方使用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.