我有一个包含多个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?
最佳答案
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*
指针传递给读取器而不是数组)。