【问题标题】:How to extract a GUID from a binary packet in C++?如何从 C++ 中的二进制数据包中提取 GUID?
【发布时间】:2016-09-09 21:05:04
【问题描述】:

我有一个在 C# 中包含多个变量的对象,该对象被编组为二进制格式并通过套接字连接发送到 C++ 应用程序。 c++ 应用程序接收 TArray 格式的二进制数据。在 C# 中序列化的字段之一是 GUID。我正在尝试反序列化数据包并填充 C++ GUID。

首先,我使用内存读取器加载二进制数据,然后转到 GUID 字段应位于的字节位置:

FMemoryReader FromBinary = FMemoryReader(TheBinaryArray, true);
FromBinary.Seek(9);

二进制中的 GUID 字段应为 16 个字节。所以我在 C++ 中创建了一个 16 字节的字段

uint32 Data[4];

并填充数据

FromBinary << Data[0];
FromBinary << Data[1];
FromBinary << Data[2];
FromBinary << Data[3];

创建一个新的 GUID

GUID guid;

现在我不知道如何用数据填充 GUID?

【问题讨论】:

    标签: c++ sockets serialization marshalling


    【解决方案1】:

    GUID 不包含 4 个 uint32 值。它由 1 个uint32、2 个uint16 和 8 个uint8 值组成。

    您可以将数组中的原始字节复制到GUID 变量中(为什么要使用uint32 Data[4] 而不是uint8 Data[16]?)。您可以为此使用memcpy()CopyMemory(),例如:

    GUID guid;
    memcpy(&guid, &Data[0], 16);
    //CopyMemory(&guid, &Data[0], 16);
    

    或者您可以简单地将数组中第一个字节的内存地址类型转换为GUID*,然后取消引用指针并将其分配给GUID变量:

    GUID guid;
    guid = *((GUID*)&Data[0]);
    

    或者,完全摆脱数组,直接将内存读取器中的字节读取到GUID 变量中(如果您能够将void* 指针传递给读取器而不是数组)。

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多