Domanda

Vengo a Objective-C da C # senza alcuna conoscenza intermedia della C. (Sì, sì, ho bisogno di imparare il C ad un certo punto e sono fermamente intenzionato a.) In certificato, chiave, e fiducia Servizi Programmazione guida , v'è il seguente codice:

static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0";
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0";

Ho un NSString che vorrei utilizzare come un identificatore qui e per la vita di me non riesco a capire come ottenere che in questa struttura dati. La ricerca attraverso Google è stato anche inutile. Ho guardato il rel="nofollow NSString Classe di riferimento e guardò il UTF8String e getCharacters metodi, ma non ho potuto ottenere il prodotto nella struttura.

Qual è il semplice, facile trucco mi manca?

È stato utile?

Soluzione

Penso che alcune persone mancano il punto qui. Tutti hanno spiegato i due array costanti che vengono impostati per i tag, ma se si desidera utilizzare un NSString, si può semplicemente aggiungere al dizionario attributo come-è. Non è necessario convertirlo in qualche cosa. Ad esempio:

NSString *publicTag = @"com.apple.sample.publickey";
NSString *privateTag = @"com.apple.sample.privatekey";

Il resto dell'esempio rimane esattamente lo stesso. In questo caso, non è necessario per le stringhe letterali C a tutti.

Altri suggerimenti

Queste sono C stringhe: Array (non NSArrays, ma le matrici C) di caratteri. L'ultimo carattere è una NUL, con il valore numerico 0.

“Uint8” è il nome CoreServices per un ottetto unsigned, che (su Mac OS X) è la stessa di un unsigned char.

static significa che l'array è specifico per questo file (se è in ambito di file) o persiste attraverso chiamate di funzione (se è all'interno di un corpo di un metodo o funzione).

const significa proprio quello che ci si indovina:. Non è possibile modificare i caratteri in questi array

\0 è un NUL, ma includendo esplicitamente in un "" letterale come mostrato in questi esempi è ridondante. Un @ letterale (senza UTF8String) è NUL-terminated comunque.

C non specifica una codifica. In Mac OS X, è in genere qualcosa di compatibile ASCII-, di solito UTF-8.

Per convertire un NSString ad un C-string, utilizzare cStringUsingEncoding: o getCString:maxLength:encoding:. Per avere la NSString estrarre la stringa C in un buffer, utilizzare <=>.

Ottenere un char* (C stringa) da un NSString non è la parte difficile. (A proposito, mi piacerebbe anche suggerire UTF8String, è molto più semplice.) Il codice da Apple in dotazione funziona perché è l'assegnazione di una stringa C letterale per le static const variabili array. Assegnazione del risultato di una funzione o di un metodo chiamata a una const probabilmente non funzionerà.

Recentemente ho risposto un SO domanda su definizione di una costante in Objective-C , che dovrebbe aiutare la vostra situazione. Si può scendere a compromessi per sbarazzarsi del modificatore static. Se è dichiarato <=>, è almeno sapere che nessuno al di fuori della unità di compilazione dove è dichiarata può fare riferimento, quindi assicuratevi solo di non lasciare un riferimento ad esso "fuga" in modo tale che altro codice potrebbe modificarlo tramite un puntatore , ecc.

Tuttavia, come @ Jason fa notare, non si può nemmeno bisogno di convertirlo in un char * a tutti. Il codice di esempio crea un oggetto NSData per ciascuna di queste stringhe. Si può solo fare qualcosa di simile all'interno del codice (che sostituisce i punti 1 e 3):

NSData* publicTag  = [@"com.apple.sample.publickey"  dataUsingEncoding:NSUnicodeStringEncoding];
NSData* privateTag = [@"com.apple.sample.privatekey" dataUsingEncoding:NSUnicodeStringEncoding];

Che sembra certo più facile per me che fare con le matrici C, se si dispone già di un NSString.

provare questo

* NSString newString = @ "Questa è una stringa di prova.";
char * TheString;

TheString = [newString cStringWithEncoding: [NSString defaultCStringEncoding]];

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top