【问题标题】:Convert C structure into unsigned char将 C 结构转换为无符号字符
【发布时间】:2013-02-22 07:33:37
【问题描述】:

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

【问题讨论】:

  • 您是否尝试简单地将packet 转换为unsigned char*?在您的情况下,它可能存在对齐问题......
  • 决定你想要的数据格式。这称为协议。在您的情况下,您可能希望将数据作为 32 位或 64 位大端整数发送,后跟三个字符。您将把这些数据“构建”到一个缓冲区中,然后发送它。客户端将收到此信息,然后从数据中重建原始结构。发送直接转换可能会引入过多的对齐和打包问题,老实说,您希望避免这些问题,尤其是当客户端可能运行与发送者不同的平台或内存架构时。

标签: c casting structure pragma


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      Structures can have extra bytes in them to make each element aligned。这些额外的字节可能会因所使用的编译器/平台而异。结果,你想做的事情可能做不到。

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

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

      【讨论】:

        【解决方案4】:

        提示

        1. 字节对齐/打包一。推荐使用自然字节对齐,确保获得最佳性能。 SUN 和 AIX'自然字节对齐' 敏感。
        2. 字节序列转换,通常发送方以大端序发送,接收方将字节转换为本地端序。小(WINDOWS、LINUX)/大(AIX、SUN、HP)

        【讨论】:

          【解决方案5】:

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

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

          {
           int var6;
           unsigned char var1;
           unsigned char var2;
           unsigned char var3[2];
           unsigned char var4;
           unsigned char var5[8];
           unsigned char var7[4];
          };
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-15
            • 2011-04-19
            • 2019-11-08
            • 1970-01-01
            • 1970-01-01
            • 2011-04-23
            • 2017-09-17
            相关资源
            最近更新 更多