Преобразование между строками NSData и base64

Какой самый простой и быстрый код для преобразования между NSData и строкой base64? Я прочитал кучу решений в SO, и в основном они связаны с добавлением еще одного класса и т. д. Я нашел отличное решение здесь, но это слишком сложно.


person aherlambang    schedule 14.05.2011    source источник
comment
Все разумные решения будут выглядеть примерно так, как пост Мэтта Галлахера, на который вы ссылались.   -  person Art Gillespie    schedule 14.05.2011
comment
Вот, чтобы найти библиотеку Галлахера, где люди таинственным образом использовали [NSData dataFromBase64String] без ссылки   -  person bobobobo    schedule 19.04.2013
comment
По какой-то непонятной причине Apple никогда не предоставляла встроенную поддержку Base64, но все сторонние комплекты практически идентичны. Просто выберите один.   -  person Hot Licks    schedule 26.09.2013


Ответы (6)


Прокрутите вниз до раздела Заключение на странице страницу, на которую вы ссылаетесь, и загрузите предоставленные файлы NSData+Base64. Это лучшее решение, которое я когда-либо видел, и оно невероятно простое в использовании. Если вы можете узнать что-нибудь о Cocoa, вы можете научиться использовать этот проект.


Пример

NSString *originalString = [NSString stringWithFormat:@"test"]; 
NSData *data = [NSData dataFromBase64String:originalString];  
NSLog([data base64EncodedString]); 

Вышеприведенное напечатает исходную строку после преобразования ее в base64 и обратно в обычную незакодированную строку.

person Ryan Wersal    schedule 14.05.2011
comment
Я загрузил два, так что мне нужно добавить этот проект в свой или я могу просто перетащить NSData + Base64? - person aherlambang; 14.05.2011
comment
Вы хотите добавить два файла в свой проект. Обычно, когда вы видите такие имена, как NSData+Base64, первое, что должно прийти вам в голову, это то, что это категория класса NSData. Другими словами, вы вызываете эти новые методы только с помощью NSData, а не какого-то нового класса Base64. - person Ryan Wersal; 14.05.2011
comment
Однако я считаю, что вам все равно нужно импортировать категорию. Лично я бы порекомендовал поместить его в ваш предварительно скомпилированный заголовок, чтобы вы могли использовать методы NSData из любого места вашего проекта. - person Ryan Wersal; 14.05.2011
comment
как я могу сделать это, Райан? Не подскажете, я думаю, это самый простой способ сделать это. - person aherlambang; 14.05.2011
comment
Я думаю, что примера кода в моем ответе будет достаточно ... Можете ли вы уточнить, какие указатели вам нужны? - person Ryan Wersal; 14.05.2011
comment
Я загрузил весь этот пакет, на который вы ссылались выше, открыл проект и перетащил два файла NSData + Base64.h и .m, а затем выдает ошибку. - person aherlambang; 15.05.2011
comment
один вопрос в файле есть base64.m, он мне тоже нужен? потому что, если я это сделаю, у него есть include ‹openssl/bio.h› и #import ‹Security/cssm.h›, что дает мне ошибку, поскольку он не знает, как его найти. ТАКЖЕ у проекта есть внешний фреймворк lubcrypto.dylib, которого у меня нет - person aherlambang; 15.05.2011
comment
Вам нужно только импортировать файл заголовка, чтобы заставить его работать. Что касается зависимости от фреймворка, я не знаю ни одного с этим конкретным проектом. Вы уверены, что импортируете заголовок, чтобы он был виден там, где вам нужно? - person Ryan Wersal; 15.05.2011

Начиная с iOS 7, NSData теперь напрямую предоставляет эту функциональность с помощью новых методов -base64EncodedDataWithOptions: и -base64EncodedStringWithOptions:. (Параметры позволяют указать, что строка должна быть перенесена на новую строку, чтобы лучше справляться с электронной почтой и дисплеями, обращенными к пользователю.)

person Sixten Otto    schedule 26.09.2013

Вам не нужна какая-либо пользовательская реализация. Создание base64 из NSData показано в других ответах. Есть противоположное направление. Из строки Base64 в NSData:

 NSString *base64Encoded = @"some base64 string";
 NSData *nsdataFromBase64String = [[NSData alloc] initWithBase64EncodedString:base64Encoded options:0];
person kraag22    schedule 15.10.2014
comment
Это было добавлено в iOS 7/OSX 10.9, и это лучшее решение, предлагаемое здесь. Документация здесь. - person jonstaff; 23.10.2014

В итоге я использовал тот же класс, что и SUDZC.

реализация была простой, сначала я сделал импорт

 #import "NSData+Base64.h"

тогда я смог вызвать свои данные.

 NSData *data = [[NSData alloc] initWithData:[NSData dataWithBase64EncodedString:strData]];
person SeeCoolGuy    schedule 18.05.2012
comment
Все, что я получаю, это то, что файл «NSData+Base64.h» не найден. ???? - person Martin; 26.09.2017
comment
@Martin Я использовал классы, сгенерированные библиотекой sudzc, она создает для вас этот класс, который затем можно импортировать в ваш файл реализации (.m) - person SeeCoolGuy; 29.09.2017

Имейте в виду, что существует больше форматов Base64.

Например, JWT используют безопасный формат URL.

person meaning-matters    schedule 13.02.2019

Или вы можете взглянуть на (совершенно новый) CryptoCompatibility пример проекта, я думаю, что есть класс-оболочка для работы с base64. Это пример MacOS, но он использует библиотеку libresolve.dylib, которая, я думаю, доступна и для iOS (по крайней мере, здесь, в iOS7).

person Stephan    schedule 26.09.2013