Convertire NSData in String?


122

Sto memorizzando una chiave privata openssl EVP_PKEY come nsdata. Per questo sto serializzando in un flusso di byte utilizzando il codice seguente

unsigned char *buf, *p;
int len;
len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len); 
p = buf;
i2d_PrivateKey(pkey, &p);

dove pkey è di tipo EVP_PKEY. Quindi sto memorizzando i byte dal buffer 'p' come NSData utilizzando la riga indicata di seguito

NSData *keydata = [NSData dataWithBytes:P length:len];

Ora lo sto convertendo in un NSString usando il codice indicato di seguito, ma quando lo stampo nella console fornisce altri caratteri.

NSString *content =[ NSString stringWithCString:[keydata bytes] encoding:NSUTF8StringEncoding];

Qualcuno potrebbe aiutare?

Fondamentalmente voglio memorizzare EVP_PKEY in un database sqlite

sono sulla strada giusta? Grazie.


Cosa intendi con "alcuni altri personaggi"? Sta stampando caratteri extra alla fine che non dovrebbero essere lì, o sta solo stampando caratteri completamente diversi da quelli che ti aspetti?
Tom Harrington,

È completamente diverso da come dovrebbe essere
Zach,

Sei sicuro che i dati siano effettivamente codificati UTF-8? Non ho familiarità con i2d_PrivateKey ma i risultati suggeriscono che non stai utilizzando la codifica di stringa corretta.
Tom Harrington,

@TOm: Grazie. era ASCIIEncoding. Ora funziona bene
Zach

No, non sei sulla strada giusta qui e tutte le risposte sembrano sbagliate. Si consiglia di utilizzare la codifica Base64, se si desidera convertire i dati in NSDataa NSString.
Maarten Bodewes

Risposte:


260

Objective-C

È possibile utilizzare (vedere Riferimento alla classe NSString )

- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

Esempio:

NSString *myString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

Nota : si prega di notare che il NSDatavalore deve essere valido per la codifica specificata (UTF-8 nell'esempio sopra), altrimenti nilverrà restituito:

Restituisce zero se l'inizializzazione fallisce per qualche motivo (ad esempio se i dati non rappresentano dati validi per la codifica).

Prima di Swift 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0 in poi

String(data: yourData, encoding: .utf8)

Vedi String # init (data: encoding :) Riferimento


Grazie per la risposta, l'ho già provato senza successo.
Zach

26
Sul debugger:po [[NSString alloc] initWithData:myData encoding:4]
Berik

7
Come può questa risposta avere numerosi voti positivi, anche se NSDatapuò contenere qualsiasi valore di byte, inclusi quelli al di fuori dell'intervallo UTF-8?
Maarten Bodewes

2
Perché le persone che sono qui stanno convertendo una risposta di dati da un server a una stringa.
Necro

1
cosa succede se NSData <strong> effettivamente </strong> contiene valori al di fuori dell'intervallo UTF-8?
Zennichimaro

24

Prima di Swift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

Per Swift 4.0:

String(data: yourData, encoding: .utf8)

3

Credo che la tua "P" come parametro dataWithBytes

NSData *keydata = [NSData dataWithBytes:P length:len];

dovrebbe essere "buf"

NSData *keydata = [NSData dataWithBytes:buf length:len];

poiché i2d_PrivateKey mette il puntatore al buffer di output p alla fine del buffer e attende ulteriori input, e buf punta ancora all'inizio del buffer.

Il codice seguente funziona per me dove pkey è un puntatore a un EVP_PKEY:

unsigned char *buf, *pp;
int len = i2d_PrivateKey(pkey, NULL);
buf = OPENSSL_malloc(len); 
pp = buf;
i2d_PrivateKey(pkey, &pp);

NSData* pkeyData = [NSData dataWithBytes:(const void *)buf length:len];
DLog(@"Private key in hex (%d): %@", len, pkeyData);

Puoi utilizzare un convertitore online per convertire i tuoi dati binari in base 64 ( http://tomeko.net/online_tools/hex_to_base64.php?lang=en ) e confrontarli con la chiave privata nel tuo file cert dopo aver usato il seguente comando e controllando l'output di mypkey.pem:

openssl pkcs12 -in myCert.p12 -nocerts -nodes -out mypkey.pem

Ho fatto riferimento alla tua domanda e a questo sito della funzione EVP per la mia risposta.



1

Un modo semplice per convertire NSData arbitrari in NSString è codificarlo in base64.

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

È quindi possibile archiviarlo nel database per riutilizzarlo in seguito. Basta decodificarlo in NSData.


1

Swift 5 :

String(data: data!, encoding: String.Encoding.utf8)

Questa è solo una copia modificata della risposta pierre23 che è meglio per me - Di solito usavo questa pagina per copiare il codice e dovevo modificare i tuoi dati in dati! ci vuole tempo. Ora io e te copiamo e incolliamo senza modifiche.
Alexander Volkov

Questa non è una domanda relativa a Swift. Inoltre, il codice di esempio nella domanda è il codice Objective-C. E non da ultimo lo scartamento forzato del codice può portare a crash imprevisti.
Cristik

@Cristik La domanda non è contrassegnata come Obj-C.
Eiko

@AlexanderVolkov puoi aggiungere uno snippet Xcode per quello, sarebbe ancora più veloce di questo;)
Cristik
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.