我正在尝试在Objective-C中实现以下方法:
- (NSString*) getGuidWithCid: (int) cid;
此方法必须使用C ++ API从数据库中检索GUID,然后将此GUID转换为GUID的字符串表示形式。 C ++ API返回的结构 GUID 具有以下定义:
typedef struct _GUID {
ul_u_long Data1;
ul_u_short Data2;
ul_u_short Data3;
ul_byte Data4[ 8 ];
} GUID;
这是我尝试实现此方法:
- (NSString*) getGuidWithCid: (int) cid
{
GUID ulguid;
((ULResultSet *) ulresultset)->GetGuid([cname UTF8String], &ulguid);
NSString* data4 = [[[NSString alloc] initWithBytes:ulguid.Data4
length:8
encoding: NSUTF8StringEncoding] autorelease];
return [NSString stringWithFormat:@"%u-%uh-%uh-%@",
ulguid.Data1,
ulguid.Data2,
ulguid.Data3,
data4];
}
此方法的前两行工作正常,因此变量 ulguid 包含有效的guid。我遇到的问题是转换GUID的字节数组部分(即GUID结构中的Data4)。我从这个方法回来的当前是由连字符分隔的三个数值,因此Data1,Data2和Data3似乎正确表示,但是Data4显示了NULL。我在这里做错了什么?
答案 0 :(得分:4)
您在创建release
后立即致电data4
。因此,在您尝试使用它时,字符串的内容无效。请考虑改为调用autorelease
。
答案 1 :(得分:2)
ulguid.Data4中的字节可能不会形成有效的UTF8字符串,因此当您尝试使用这些字节创建字符串时,您将返回nil。
答案 2 :(得分:1)
我已成功实施此方法如下:
- (NSString*) getGuidWithCid: (int) cid
{
GUID ulguid;
((ULResultSet *) ulresultset)->GetGuid(cid, &ulguid);
char buffer[37];
sprintf(buffer, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",
ulguid.Data1, ulguid.Data2, ulguid.Data3,
ulguid.Data4[0], ulguid.Data4[1],
ulguid.Data4[2], ulguid.Data4[3],
ulguid.Data4[4], ulguid.Data4[5],
ulguid.Data4[6], ulguid.Data4[7]);
return [[[NSString alloc] initWithBytes:buffer
length:sizeof(buffer)
encoding:NSASCIIStringEncoding] autorelease];
}
感谢Ferdinand Beyer(http://stackoverflow.com/users/34855/ferdinand-beyer)帮助我找到解决方案。