Преобразовать 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 ответов:
С
вы можете использовать ( см. Ссылка На Класс 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 (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 функция сайта на мой ответ.
простой способ, чтобы преобразовать произвольный формат NSData, чтобы NSString является base64 кодировать его.
NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];
затем вы можете сохранить его в базе данных для повторного использования. Просто декодировать его обратно в формат NSData.