如何从 C++ 中的二进制数据包中提取 GUID?
How to extract a GUID from a binary packet in C++?
我在 C# 中有一个包含多个变量的对象,该对象被编组为二进制格式并通过套接字连接发送到 C++ 应用程序。 C++ 应用程序接收格式为 TArray < uint8 > 的二进制数据。在 C# 中序列化的字段之一是 GUID。我正在尝试反序列化数据包并填充 C++ GUID。
首先,我使用内存 reader 加载二进制数据,然后转到 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?
A 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]);
或者,简单地完全摆脱数组并直接从内存 reader 中读取字节到 GUID
变量中(如果你能够将 void*
指针传递给reader 而不是数组)。
我在 C# 中有一个包含多个变量的对象,该对象被编组为二进制格式并通过套接字连接发送到 C++ 应用程序。 C++ 应用程序接收格式为 TArray < uint8 > 的二进制数据。在 C# 中序列化的字段之一是 GUID。我正在尝试反序列化数据包并填充 C++ GUID。
首先,我使用内存 reader 加载二进制数据,然后转到 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?
A 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]);
或者,简单地完全摆脱数组并直接从内存 reader 中读取字节到 GUID
变量中(如果你能够将 void*
指针传递给reader 而不是数组)。