Преобразовать NSData в строку?


Я храню закрытый ключ openssl EVP_PKEY как nsdata. Для этого я сериализовать в поток байтов, используя код ниже

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

где pkey имеет тип EVP_PKEY. Затем я сохраняю байты из буфера ' p ' как NSData, используя строку, приведенную ниже

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

Теперь я конвертирую его в NSString, используя код, приведенный ниже, но когда я печатаю его в консоль, он дает некоторые другие символы.

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

может кто поможет?

В основном я хочу сохранить EVP_PKEY в базу данных sqlite

Я на правильном пути? Спасибо.

6 110

6 ответов:

С

вы можете использовать ( см. Ссылка На Класс NSString )

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

пример :

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

Примечание: Пожалуйста, обратите внимание на NSData значение должно быть допустимым для указанной кодировки (UTF-8 в примере выше), в противном случае nil будут возвращены:

возвращает nil, если инициализация по какой-либо причине не выполняется (например, если данные не представляют допустимые данные для кодирование.)

Prior Swift 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0

String(data: yourData, encoding: .utf8)

посмотреть строка#init (data:encoding:) ссылка

Предыдущий Swift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

Для Swift 3.0:

String(data: yourData, encoding: .utf8)

Я считаю, что ваш " P " как dataWithBytes param

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

должно быть "buf"

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

так как i2d_PrivateKey помещает указатель на выходной буфер p в конце буфера и ждет дальнейшего ввода, а buf все еще указывает на начало вашего буфера.

следующий код работает для меня, где pkey-это указатель на 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);

вы можете использовать онлайн конвертер для преобразования двоичных данных в базу 64 (http://tomeko.net/online_tools/hex_to_base64.php?lang=en) и сравните его с закрытым ключом в вашем файле сертификата после использования следующей команды и проверки вывода mypkey.Пем:

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

я ссылался на ваш вопрос и это EVP функция сайта на мой ответ.

Swift 3:

String(data: data, encoding: .utf8)

Swift:

String(data: data!, encoding: NSUTF8StringEncoding)

простой способ, чтобы преобразовать произвольный формат NSData, чтобы NSString является base64 кодировать его.

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

затем вы можете сохранить его в базе данных для повторного использования. Просто декодировать его обратно в формат NSData.