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

标签 c bytearray 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;
    }

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

最佳答案

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

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

关于可读性、可理解性和清晰度,您的第一个变体很棒。它也适用于您使用的任何奇怪平台(字节序、对齐),前提是 CHAR_BIT == 8

关于c - 反序列化函数(字节数组到 uint32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6145390/

相关文章:

java - 为什么 byteArray 的长度是 22 而不是 20?

java - 从 Android 中的 .ser 文件读取/解析 JSON 对象

c# - 反序列化具有未知值名称的 JSON 并在 C# 中获取所述名称

closeir() 会导致现有列表的节点发生变化

c - 实现我自己的系统调用

c - struct中 "typedef"是什么意思

java - decodeByteArray 和 copyPixelsToBuffer 不工作。 SkImageDecoder::Factory 返回空

c - 如何为void函数指针数组分配内存并为数组分配地址

c# - 将WAV文件转换为字节数组会降低音频速度

c#-4.0 - 使用 Json.Net 将 int 转换为 bool