2011-03-21 45 views
1

我想实现在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。我在这里做错了什么?

回答

2

这有可能是在ulguid.Data4字节没有形成一个有效的UTF8字符串,所以你得到零回来时,你尝试创建与这些字节的字符串。

+0

我认为你是正确的轨道上,迦勒。我认为我正在努力的是GUID的字节数组部分实际包含的内容。我想我可以将它转换为UTF8字符串,但显然这比它更多。我发现下面的链接,解释了GUID结构:http://msdn.microsoft.com/en-us/library/aa373931%28VS.85%29.aspx。看来我需要从最后6个字节中分别读取前2个字节。在这个阶段我不太确定我是如何做到这一点的。 – BruceHill 2011-03-22 07:34:06

+0

摆脱字符串的'data4'改变格式字符串使用%QX,打印一个8字节INT为十六进制。然后传入'ulguid.Data4'作为第四个值而不是'data4'。另外,整个字符串不应该是十六进制格式吗?如果是这样,那么格式字符串应该是这样的:@“%X-%uX-%uX-%qX”,尽管我现在看到你已经找到了一个等效的解决方案。 – Caleb 2011-03-22 11:27:04

4

要调用releasedata4创建后immedaitely它。因此,字符串的内容在您尝试使用它的时候是无效的。考虑改用autorelease

+0

谢谢,fbrereto。我纠正了这个问题,但我仍然收到空回来。 – BruceHill 2011-03-22 07:25:44

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]; 
} 

由于去费迪南德拜尔(http://stackoverflow.com/users/34855/ferdinand-beyer)帮助我得到这个解决方案。