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