Преобразование CFStringRef в char *
Я получаю CFStringRef
из CFDictionaryRef
с помощью CFDictionaryGetValue
.
Я пытаюсь преобразовать CFStringRef
в char*
с помощью CFStringGetCString
или CFStringGetCStringPtr
, и они либо возвращают NULL, либо сбой.
Есть ли способ сделать это? Как?
Спасибо.
EDIT: пример кода:
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);
Ответы
Ответ 1
В главе 17 пример кода в iOS: 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
находится в имени). Связанный примерный код также имеет несколько более быструю версию, в которой используется буфер, который вы предоставляете.
Ответ 2
Другой ответ:
const char *cs = CFStringGetCStringPtr( cfString, kCFStringEncodingMacRoman ) ;
puts( cs ) ; // works
Я не могу найти причину, по которой kCFStringEncodingUTF8
дает NULL, но kCFStringEncodingMacRoman
работает нормально.
Ответ 3
почему бы просто: printf("%s\n", CFStringGetCStringPtr(uniqueid, kCFStringEncodingUTF8));
?
Ответ 4
Для одной и той же проблемы существует другое однострочное решение:
char * myCString = [(__bridge NSString *)myCfstring UTF8String];
Счастливое кодирование:)
Ответ 5
Из Руководство по программированию строк для Core Foundation Документация. Вот как вы получаете содержимое CFStringRef в виде строки C.
Я сделал для него модификацию так, что это должно делать то, что вы ищете.
#include <CoreFoundation/CoreFoundation.h>
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