反序列化函数(字节数组到 uint32 )

emg*_*mge 7 c arrays deserialization

编写反序列化函数将字节数组转换为 32 位无符号整数的最佳方法是什么?

    typedef unsigned long  uint32;

    uint32 deserialize_uint32(unsigned char *buffer)
    {
        uint32 value = 0;

        value |= buffer[0] << 24;
        value |= buffer[1] << 16;
        value |= buffer[2] << 8;
        value |= buffer[3];
        return value;

    }

    unsigned char* deserialize_uint32B(unsigned char *buffer, uint32* value)
    {
        *value = 0;

        *value |= buffer[0] << 24;
        *value |= buffer[1] << 16;
        *value |= buffer[2] << 8;
        *value |= buffer[3];
        return buffer + 4;
    }
Run Code Online (Sandbox Code Playgroud)

谢谢!或者如果有更好的方法请告诉我..谢谢!

Rol*_*lig 5

我更喜欢你的第一个变体而不是第二个。或者,您可以通过使用四个局部变量来利用并行处理,这些变量将各个字节移动正确的量。然后,在最后一行你return b0shifted | b1shifted | b2shifted | b3shifted

无论如何,这一切都取决于您的编译器。您的第二个变体包含更多加载/存储操作,因此第一个变体具有更少的抽象操作。

就可读性、可理解性和清晰度而言,你的第一个变体非常棒。它也适用于您使用的任何奇怪的平台(字节顺序、对齐方式),前提是CHAR_BIT == 8.

  • 如果“CHAR_BIT &gt; 8”也有效,只要保持输入“unsigned char”值在 0 到 255 之间(含 0 和 255)的前提条件。 (3认同)