Conversion de CFSsortingngRef en char *

CFSsortingngRef un CFSsortingngRef d’un CFDictionaryRef avec CFDictionaryGetValue .

J’ai essayé de convertir CFSsortingngRef en un caractère char* aide de CFSsortingngGetCSsortingng ou CFSsortingngGetCSsortingngPtr et ils renvoient un NULL ou un CFSsortingngGetCSsortingngPtr .

Y a-t-il un moyen de faire cela? Comment?

Je vous remercie.

EDIT: exemple de code:

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

À partir de l’ exemple de code du chapitre 17 sous iOS: PTL .

 char * MYCFSsortingngCopyUTF8Ssortingng(CFSsortingngRef aSsortingng) { if (aSsortingng == NULL) { return NULL; } CFIndex length = CFSsortingngGetLength(aSsortingng); CFIndex maxSize = CFSsortingngGetMaximumSizeForEncoding(length, kCFSsortingngEncodingUTF8) + 1; char *buffer = (char *)malloc(maxSize); if (CFSsortingngGetCSsortingng(aSsortingng, buffer, maxSize, kCFSsortingngEncodingUTF8)) { return buffer; } free(buffer); // If we failed return NULL; } 

Le tampon résultant doit toujours être libéré (c’est pourquoi Copy est dans le nom). L’exemple de code lié a également une version légèrement plus rapide qui utilise un tampon fourni.

Une autre réponse:

 const char *cs = CFSsortingngGetCSsortingngPtr( cfSsortingng, kCFSsortingngEncodingMacRoman ) ; puts( cs ) ; // works 

Je ne trouve pas la raison pour laquelle kCFSsortingngEncodingUTF8 donne NULL, mais kCFSsortingngEncodingMacRoman semble fonctionner kCFSsortingngEncodingMacRoman .

Il existe une autre solution en une ligne pour le même problème:

 char * myCSsortingng = [(__bridge NSSsortingng *)myCfssortingng UTF8Ssortingng]; 

Bonne codage 🙂

pourquoi pas simplement: printf("%s\n", CFSsortingngGetCSsortingngPtr(uniqueid, kCFSsortingngEncodingUTF8)); ?

Extrait du Guide de programmation de chaînes pour la documentation Core Foundation . Voici comment vous obtenez le contenu d’un CFSsortingngRef en tant que chaîne C.

J’ai apporté une modification à celui-ci en tant que tel, cela devrait faire ce que vous recherchez.

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