Подтвердить что ты не робот

Преобразование NSData в String?

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

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

4b9b3361

Ответ 1

Objective-C

Вы можете использовать (см. NSString Class Reference)

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

Пример:

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

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

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

До Свифта 3.0

String(data: yourData, encoding: NSUTF8StringEncoding)

Swift 3.0

String(data: yourData, encoding: .utf8)

Смотрите String # init (data: encoding :) Ссылка

Ответ 2

До Свифта 3.0:

String(data: yourData, encoding: NSUTF8StringEncoding)

Для Swift 4.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 для моего ответа.

Ответ 4

Swift 3:

String(data: data, encoding: .utf8)

Ответ 5

Swift:

String(data: data!, encoding: NSUTF8StringEncoding)

Ответ 6

Простой способ преобразовать произвольные NSData в NSString - это закодировать их в base64.

NSString *base64EncodedKey = [keydata base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];

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