在Objective-C ++中将C ++ GUID结构转换为NSString *

时间:2011-03-21 23:05:11

标签: c++ objective-c xamarin.ios objective-c++

我正在尝试在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。我在这里做错了什么?

3 个答案:

答案 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)帮助我找到解决方案。