【问题标题】:Convert struct into bytes将结构转换为字节
【发布时间】:2011-02-11 03:39:21
【问题描述】:

如何在具有 little-endian 的处理器上将任何结构转换为字节数组?

【问题讨论】:

  • 请根据您的要求进行扩展 - 请注意,您的答案将非常依赖于处理器架构
  • little endian 的寻址单位是什么?你真正想做什么?

标签: c++


【解决方案1】:

我喜欢使用union:

typedef struct b {
  unsigned int x;
  unsigned int y;
} b_s;

typedef union a {
  b_s my_struct;
  char ary[sizeof(b_s)];
} a_u;

【讨论】:

  • 为什么不只是ary[sizeof(b)]?
【解决方案2】:

所有这些答案的问题在于,如果不了解要交换的数据,就无法真正进行哑字节交换。字符数据不会被交换。 64 位整数需要不同类型的交换,具体取决于所讨论的两个处理器如何实现它们。

【讨论】:

    【解决方案3】:

    我会凝视void*。

    struct gizmo 
    {
    //w/e
    };
    
    //stuff
    
    gizmo *G = new gizmo;
    
    void* bytearray = (void*)G;
    

    你的结构如何被打包是不明确的,取决于编译器、ABI 和 CPU。你必须从你的手册和一些汇编阅读中弄清楚。

    【讨论】:

    • 你不能通过 void* 访问字节
    • 因为你不能取消引用一个 void*,你不能访问它指向的任何东西(也许使用 memcpy 的 bar,在这种情况下不需要中间 void*) foo[0];如果 foo 为 void*,则为编译器错误。使用 unsigned char* 访问单个字节。
    【解决方案4】:

    你想做什么?如果您尝试序列化结构以便将其保存到文件或在消息中传递,则最好使用专为该结构设计的工具,例如 boost::serialization。

    如果您只想要一个字节数组,您可以像其他人提到的那样reinterpret_cast<char*>,或者这样做:

    MyStruct s;
    char [] buffer = new char[sizeof(s)];
    memcpy(&buffer, &s, sizeof(s));
    

    【讨论】:

      【解决方案5】:
      (char*)&someStruct
      

      【讨论】:

        【解决方案6】:

        您可以使用char* 访问 C++ 中的任何类型的对象,因此:

        struct S
        {
            int a;
            int b;
            // etc.
        };
        
        S my_s;
        
        char* my_s_bytes = reinterpret_cast<char*>(&my_s);
        
        // or, if you prefer static_cast:
        char* my_s_bytes = static_cast<char*>(static_cast<void*>(&my_s));
        

        (至少有some debate 的正确性超过了reinterpret_cast 与static_cast;实际上这并不重要——两者都应该产生相同的结果)

        【讨论】:

        • :-) 现在 C++ 上的语言改进太多了。而在此之前,这就足够了:char* b = (char*)&amp;my_s; 如果我再次学习 C++,我会先阅读一些关于这些演员构造的内容。
        • @Michael:在这种情况下,C 风格的演员表与reinterpret_cast 相同,因为static_cast 和const_cast 的组合都不有效。使用 C++ 风格的演员表可以保证你得到你想要的演员表; C 风格的演员表基本上只是尝试一系列五种不同类型的演员表,直到找到一个有效的演员表。
        • 根据您指定的结构,答案是正确的。但是,将一些短裤、大整数或字符数据放入其中,这是非常错误的。
        • @T.E.D.:“大错特错”完全取决于 char 数组的使用方式。当然,有时这不是答案,但通常这已经足够了。这些要求肯定没有明确说明。
        猜你喜欢
        • 2012-11-26
        • 1970-01-01
        • 2013-12-11
        • 2020-10-19
        • 1970-01-01
        • 2011-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多