将C结构转换为unsigned char

时间:2013-02-22 07:33:37

标签: c casting structure pragma

我有一个函数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发送此数据? 感谢..

5 个答案:

答案 0 :(得分:5)

如果你的尺码正确,你可以简单地投射到unsigned char *

PacketData pkt;
UartSend((unsigned char *)&pkt, sizeof(pkt));
在这种情况下,

unsigned char *实际上只意味着字节。

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

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

这样的GNU扩展

答案 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)

提示

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

答案 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];
};