Конвертировать NSData в строку?

97

Я сохраняю закрытый ключ EVS_PKEY opensl как 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

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

  • 0
    Что вы имеете в виду, «некоторые другие персонажи»? Это печать дополнительных символов в конце, которых не должно быть, или просто печать совершенно других символов, чем вы ожидаете?
  • 0
    Это полностью отличается от того, что это должно быть
Показать ещё 3 комментария
Теги:
iphone
nsdata
openssl

5 ответов

221
Лучший ответ

Objective-C

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

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

Пример:

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

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

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

Prior Swift 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0

String(data: yourData, encoding: .utf8)

См. Строка # init (данные: кодирование:) Ссылка

  • 0
    Спасибо за ваш ответ. Я уже попробовал это безуспешно.
  • 0
    Вы пытались добавить свой собственный нулевой терминатор?
Показать ещё 8 комментариев
23

Prior Swift 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

Для Swift 3.0:

String(data: yourData, encoding: .utf8)
3

Я считаю, что ваш "P" в качестве параметра dataWithBytes

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) и сравнить его с закрытым ключом в вашем cert после использования следующей команды и проверки вывода mypkey.pem:

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

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

2

Swift 3:

String(data: data, encoding: .utf8)
0

Swift:

String(data: data!, encoding: NSUTF8StringEncoding)
  • 0
    Это всего лишь измененная копия ответа от pierre23, которая лучше для меня - я обычно использовал эту страницу, чтобы скопировать код, и мне пришлось модифицировать ваши данные в данные! это требует времени. Теперь я и вы копируете и вставляете без изменений.
  • 0
    Это не связанный со Свифтом вопрос. Более того, пример кода в вопросе - код Objective-C. И, наконец, принудительное развертывание кода может привести к неожиданным сбоям.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню