将CFStringRef转换为char *

我使用CFDictionaryGetValueCFDictionaryRef获取CFStringRef

我一直在尝试使用CFStringGetCStringCFStringGetCStringPtrCFStringRef转换为char* ,它们返回NULL或崩溃。

有没有办法做到这一点? 怎么样?

谢谢。

编辑:示例代码:

 SecStaticCodeRef staticCode; CFDictionaryRef information; SecCSFlags flags = kSecCSInternalInformation | kSecCSSigningInformation | kSecCSRequirementInformation | kSecCSInternalInformation; CFURLRef pathURL = NULL; CFStringRef pathStr = NULL; CFStringRef uniqueid; char* str = NULL; CFIndex length; pathStr = CFStringCreateWithCString(kCFAllocatorDefault, filename, kCFStringEncodingUTF8); pathURL = CFURLCreateWithString(kCFAllocatorDefault, pathStr, NULL); SecStaticCodeCreateWithPath(pathURL, kSecCSDefaultFlags, &staticCode); SecCodeCopySigningInformation(staticCode, flags, &information); uniqueid = (CFStringRef) CFDictionaryGetValue(information, kSecCodeInfoUnique); // how do I convert it here to char *? length = CFStringGetLength(uniqueid); str = (char *)malloc( length + 1 ); CFStringGetCString(uniqueid, str, length, kCFStringEncodingUTF8); printf("hash of signature is %s\n", str); CFRelease(information); CFRelease(staticCode); 

来自iOS中的第17章示例代码 :PTL 。

 char * MYCFStringCopyUTF8String(CFStringRef aString) { if (aString == NULL) { return NULL; } CFIndex length = CFStringGetLength(aString); CFIndex maxSize = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8) + 1; char *buffer = (char *)malloc(maxSize); if (CFStringGetCString(aString, buffer, maxSize, kCFStringEncodingUTF8)) { return buffer; } free(buffer); // If we failed return NULL; } 

必须始终释放生成的缓冲区(这就是Copy名称中的原因)。 链接的示例代码也有一个稍微快一点的版本,使用您提供的缓冲区。

另一个答案:

 const char *cs = CFStringGetCStringPtr( cfString, kCFStringEncodingMacRoman ) ; puts( cs ) ; // works 

我找不到kCFStringEncodingUTF8给出NULL的原因,但kCFStringEncodingMacRoman似乎工作正常。

针对同一问题还有另一种解决方案:

 char * myCString = [(__bridge NSString *)myCfstring UTF8String]; 

快乐编码:)

为什么不简单: printf("%s\n", CFStringGetCStringPtr(uniqueid, kCFStringEncodingUTF8));

来自Core Foundation文档的字符串编程指南 。 以下是如何将CFStringRef的内容作为C字符串获取。

我已经对它进行了修改,这应该做你想要的。

 #include  CFStringRef str; //Removed CFRange const char *bytes; //This is where the conversion result will end up. str = CFSTR("You Want this String!\n"); //Changed this part bytes = CFStringGetCStringPtr(str, kCFStringEncodingMacRoman); if (bytes == NULL) { //Adding in getting the size CFIndex stringLengthIndex = CFStringGetLength(str); //Converted index (signed long ) to int char localBuffer[(int) stringLengthIndex]; Boolean success; success = CFStringGetCString(str, localBuffer, stringLengthIndex, kCFStringEncodingMacRoman); } //At this point the "bytes" variable should contain your C string copied from the provided CFStringRef