webentwicklung-frage-antwort-db.com.de

NSData in String konvertieren?

Ich speichere einen openssl privaten Schlüssel EVP_PKEY als Nsdata. Dazu serialisiere ich mit dem folgenden Code in einen Byte-Stream

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

dabei ist pkey vom Typ EVP_PKEY . Dann speichere ich die Bytes aus dem Puffer 'p' als NSData in der unten angegebenen Zeile

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

Jetzt konvertiere ich es in einen NSString mit dem unten angegebenen Code, aber wenn ich es in die Konsole drucke, gibt es einige andere Zeichen.

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

Könnte jemand helfen? 

Grundsätzlich möchte ich den EVP_PKEY .__ speichern. in eine SQLite-Datenbank

bin ich auf dem richtigen Weg? Danke.

112
Zach

Ziel c

Sie können verwenden (siehe NSString-Klassenreferenz )

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

Beispiel:

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

Bemerkung: Bitte beachten Sie, dass der Wert NSData für die angegebene Kodierung (UTF-8 im obigen Beispiel) gültig sein muss. Andernfalls wird nil zurückgegeben:

Gibt null zurück, wenn die Initialisierung aus irgendeinem Grund fehlschlägt (z. B. wenn Daten keine gültigen Daten für die Kodierung darstellen).

Vor Swift 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0

String(data: yourData, encoding: .utf8)

Siehe String # init (Daten: Kodierung :) Referenz

247
louiscoquio

Vor Swift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

Für Swift 4.0:

String(data: yourData, encoding: .utf8)
23
pierre23

Ich glaube dein "P" als dataWithBytes-Parameter

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

sollte "buf" sein

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

da i2d_PrivateKey den Zeiger auf den Ausgabepuffer p am Ende des Puffers setzt und auf weitere Eingaben wartet, und buf weiterhin auf den Anfang Ihres Puffers zeigt.

Der folgende Code funktioniert für mich, wobei pkey ein Zeiger auf einen EVP_PKEY ist:

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);

Sie können einen Online-Konverter verwenden, um Ihre binären Daten in Basis 64 ( http://tomeko.net/online_tools/hex_to_base64.php?lang=de ) zu konvertieren und nach der Verwendung mit dem privaten Schlüssel in Ihrer cert-Datei zu vergleichen folgenden Befehl und Überprüfen der Ausgabe von mypkey.pem:

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

Ich habe auf Ihre Frage und diese EVP-Funktionsseite für meine Antwort verwiesen.

3

Swift 3:

String(data: data, encoding: .utf8)
2
Travis M.

Eine einfache Möglichkeit, beliebige NSData in NSString zu konvertieren, ist die Base64-Codierung. 

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

Sie können es dann zur späteren Wiederverwendung in Ihrer Datenbank speichern. Dekodiere es einfach wieder in NSData.

0
Billy

Schnell:

String(data: data!, encoding: NSUTF8StringEncoding)
0