我想实现在Objective-C以下方法:在Objective-C++转换为C++ GUID结构的NSString *
- (NSString*) getGuidWithCid: (int) cid;
这种方法使用C从数据库必须检索GUID ++ API,然后将此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)。什么我正在从这个方法回到目前是用连字符隔开三个数值,因此数据1,数据2和数据3似乎是正确表示,但正在显示的数据4 NULL。我在这里做错了什么?
我认为你是正确的轨道上,迦勒。我认为我正在努力的是GUID的字节数组部分实际包含的内容。我想我可以将它转换为UTF8字符串,但显然这比它更多。我发现下面的链接,解释了GUID结构:http://msdn.microsoft.com/en-us/library/aa373931%28VS.85%29.aspx。看来我需要从最后6个字节中分别读取前2个字节。在这个阶段我不太确定我是如何做到这一点的。 – BruceHill 2011-03-22 07:34:06
摆脱字符串的'data4'改变格式字符串使用%QX,打印一个8字节INT为十六进制。然后传入'ulguid.Data4'作为第四个值而不是'data4'。另外,整个字符串不应该是十六进制格式吗?如果是这样,那么格式字符串应该是这样的:@“%X-%uX-%uX-%qX”,尽管我现在看到你已经找到了一个等效的解决方案。 – Caleb 2011-03-22 11:27:04