我有一个函数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)
如何将此结构转换为unsigned char以通过UartSend发送此数据? 感谢..
答案 0 :(得分:5)
如果你的尺码正确,你可以简单地投射到unsigned char *
:
PacketData pkt;
UartSend((unsigned char *)&pkt, sizeof(pkt));
在这种情况下, unsigned char *
实际上只意味着字节。
当然,在连接的另一端,您需要合并程序逻辑以重新转换为PacketData
(或某些类似的结构)。
编辑:但是,请注意,正如@WhozCraig在评论中指出的那样,如果您的目标平台与源平台不同,则需要来考虑对齐问题(或者,依赖于像__packed__
)
答案 1 :(得分:0)
您可以使用union以结构或unsigned char数组的形式访问数据。 这样,您可以避免使用直接转换产生的锯齿问题。
答案 2 :(得分:0)
Structures can have extra bytes in them to make each element aligned。这些额外的字节可能因使用的编译器/平台而异。因此,您可能无法做到这一点。
我建议你写一个函数来做jo。它需要将每个元素拉出结构并单独发送。接收值时需要第二个函数,并将它们存储回函数中。
请记住,endianism也可能是一个问题,并使用network byte ordering functions确保以标准格式发送整数值。如果系统是不同的类型,浮点值可能需要某种额外的转换步骤。
答案 3 :(得分:0)
提示
- 字节对齐/打包一个。建议使用自然字节对齐,以获得最佳性能。 SUN和AIX '自然字节对齐'敏感。
- 字节序列转换,通常发送方用big-endian发送出去,接收方将BYTES转换为本地字节序。小(WINDOWS,LINUX)/大(AIX,SUN,HP)
醇>
答案 4 :(得分: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];
};