如何在C ++中从二进制数据包中提取GUID?

时间:2016-05-13 15:26:16

标签: c++ sockets serialization marshalling

我有一个包含C#中多个变量的对象,这些变量被编组为二进制格式并通过套接字连接发送到C ++应用程序。 c ++应用程序以TArray<的格式接收二进制数据。 uint8>。在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?

1 个答案:

答案 0 :(得分:2)

uint32不包含4个uint32值。它由1 uint16,2 uint8和8 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*变量(如果能够将// Create the family name column. final TextColumn<ContactInfo> familyNameColumn = new TextColumn<ContactInfo>() { @Override public String getValue(ContactInfo object) { return object.getFamilyName(); } }; table.setColumnWidth(familyNameColumn, 20, Unit.PCT); // Make the family name sortable familyNameColumn.setSortable(true); // Add the columns table.addColumn(familyNameColumn, UserMenuConstants.FAMILY_NAME_COLUMN); table.addColumn(familyAdministratorColumn, UserMenuConstants.FAMILY_ADMINISTRATOR_COLUMN); table.addColumn(apartmentNuberColumn, UserMenuConstants.FAMILY_APARTMENT_NUMBER_COLUMN); table.addColumn(emailColumn, UserMenuConstants.EMAIL_ADDRESS_COLUMN); table.addColumn(phoneNumberColumn, UserMenuConstants.PHONE_NUMBER_COLUMN); DBGetContactInfoAsync rpcService = (DBGetContactInfoAsync) GWT.create(DBGetContactInfo.class); ServiceDefTarget target = (ServiceDefTarget) rpcService; String moduleRelativeURL = GWT.getModuleBaseURL() + "DBGetContactInfoImpl"; target.setServiceEntryPoint(moduleRelativeURL); rpcService.getContacts(new AsyncCallback<List<ContactInfo>>() { @Override public void onSuccess(List<ContactInfo> result) { table.setRowCount(result.size()); ListDataProvider<ContactInfo> dataProvider = new ListDataProvider<ContactInfo>(); dataProvider.addDataDisplay(table); List<ContactInfo> list = dataProvider.getList(); for (ContactInfo contactInfo : result) { list.add(contactInfo); } ListHandler<ContactInfo> listHandler = new ListHandler<ContactInfo>(result); listHandler.setComparator(familyNameColumn, new Comparator<ContactInfo>() { @Override public int compare(ContactInfo o1, ContactInfo o2) { return o1.getFamilyName().compareTo(o2.getFamilyName()); } }); table.addColumnSortHandler(listHandler); } @Override public void onFailure(Throwable caught) { ... } }); 指针传递给读取器而不是数组)。