【问题标题】:Converting a C++ GUID structure to NSString* in Objective-C++在 Objective-C++ 中将 C++ GUID 结构转换为 NSString*
【发布时间】:2011-03-21 23:05:10
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您在创建它后立即在data4 上调用release。因此,字符串的内容在您尝试使用它时是无效的。考虑改用autorelease。

    【讨论】:

    • 谢谢,fbrereto。我已经更正了,但仍然返回 null。
    【解决方案2】:

    ulguid.Data4 中的字节可能不会形成有效的 UTF8 字符串,因此当您尝试使用这些字节创建字符串时会返回 nil。

    【讨论】:

    • 我认为你在正确的轨道上,Caleb。我认为我正在努力解决的是 GUID 的字节数组部分实际包含的内容。我以为我可以将它转换为 UTF8 字符串,但显然还有更多。我找到了解释 GUID 结构的以下链接:msdn.microsoft.com/en-us/library/aa373931%28VS.85%29.aspx。看来我需要将前 2 个字节与后 6 个字节分开读取。在这个阶段我不太确定我该怎么做。
    • 去掉字符串 data4 并更改格式字符串以使用 %qX,它将 8 字节的 int 打印为十六进制。然后传入ulguid.Data4 作为第四个值而不是data4。另外,整个字符串不应该是十六进制格式吗?如果是这样,那么格式字符串应该类似于:@"%X-%uX-%uX-%qX",尽管我现在看到您已经找到了等效的解决方案。
    【解决方案3】:

    我已经成功实现了这个方法,如下:

    - (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) 帮助我找到了这个解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 2020-10-26
      • 2016-12-17
      • 2010-12-22
      • 2012-10-06
      • 2011-12-04
      • 2011-07-05
      • 2011-01-24
      相关资源
      最近更新 更多