Я хотел бы сделать base64
кодирование и декодирование, но я не мог найти поддержку от iPhone SDK
. Как я могу сделать base64
кодирование и декодирование с или без библиотеки?
ios
objective-c
base64
BlueDolphin
источник
источник
Ответы:
Это хороший вариант использования для категорий Objective C .
Для кодировки Base64:
Для декодирования Base64:
источник
Действительно, очень быстрая реализация, которая была перенесена (и изменена / улучшена) из библиотеки PHP Core в собственный код Objective-C, доступна в классе QSStrings из библиотеки QSUtilities . Я сделал быстрый тест: файл изображения размером 5,3 МБ (JPEG) занял менее 50 мс для кодирования и около 140 мс для декодирования.
Код для всей библиотеки (включая методы Base64) доступен на GitHub .
Или, в качестве альтернативы, если вы хотите, чтобы код просто самих методов Base64, я разместил его здесь:
Во-первых, вам нужны таблицы сопоставления:
Кодировать:
Расшифровать:
источник
strResult
в кодере, похоже, просочилась; это просто нужноfree()
в конце (до возвращения, но послеNSString stringWithCString
)encodeBase64WithData:
методе неcalloc()
нужно ли увеличивать первый параметр в вызове на 1, чтобы учесть нулевой терминатор ('\0'
), который вы добавляете в конце?Исторически мы бы направили вас к одной из множества сторонних библиотек base 64 (как обсуждалось в других ответах) для преобразования из двоичных данных в строку base 64 (и обратно), но iOS 7 теперь имеет встроенную кодировку base 64 (и предоставляет доступ к ранее закрытым методам iOS 4 на случай, если вам потребуется поддержка более ранних версий iOS).
Таким образом, чтобы преобразовать
NSData
вNSString
базовое представление 64 вы можете использоватьbase64EncodedStringWithOptions
. Если вам необходимо поддерживать версии iOS до 7.0, вы можете сделать:И конвертировать базу 64
NSString
обратноNSData
можно использоватьinitWithBase64EncodedString
. Аналогично, если вам нужно поддерживать версии iOS до 7.0, вы можете сделать:Очевидно, что если вам не нужна обратная совместимость с версиями iOS до 7.0, это даже проще, просто используйте
base64EncodedStringWithOptions
илиinitWithBase64EncodedString
, соответственно, и не беспокойтесь о проверке во время выполнения для более ранних версий iOS. Фактически, если вы используете приведенный выше код, когда ваша минимальная цель - iOS 7 или выше, вы фактически получите предупреждение компилятора об устаревших методах. Итак, в iOS 7 и выше вы просто конвертируете в строку base 64 строку с:и снова с:
источник
iOS включает встроенную поддержку для кодирования и декодирования base64. Если вы посмотрите на
resolv.h
вы должны увидеть две функцииb64_ntop
иb64_pton
. Библиотека Square SocketRocket предоставляет разумный пример того, как использовать эти функции из target-c.Эти функции довольно хорошо протестированы и надежны - в отличие от многих реализаций, которые вы можете найти в случайных публикациях в Интернете. Не забудьте связать против
libresolv.dylib
.источник
Так как это, похоже, хит номер один в Google по кодировке base64 и iphone, я решил поделиться своим опытом с фрагментом кода выше.
Это работает, но это очень медленно. Тест на случайном изображении (0,4 МБ) на родном iphone занял 37 секунд. Основной причиной, вероятно, является вся магия ООП - одиночные символьные строки NSS и т. Д., Которые автоматически высвобождаются только после завершения кодирования.
Другое предложение, размещенное здесь (ab), использует библиотеку openssl, которая также выглядит как излишняя.
Код ниже занимает 70 мс - это ускорение в 500 раз. Это только делает кодирование base64 (декодирование последует, как только я столкнусь с ним)
Я пропустил обрезку строк, так как мне это не нужно, но добавить тривиально.
Для тех, кто заинтересован в оптимизации: цель состоит в том, чтобы минимизировать то, что происходит в основном цикле. Поэтому вся логика обработки последних 3 байтов обрабатывается вне цикла.
Также попробуйте работать с данными на месте, без дополнительного копирования в / из буферов. И уменьшите любую арифметику до минимума.
Заметьте, что биты, которые собираются вместе для поиска записи в таблице, не будут перекрываться, когда они должны быть упорядочены вместе без смещения. Поэтому основным улучшением может стать использование 4 отдельных 256-байтовых таблиц поиска и устранение сдвигов, например:
Конечно, вы можете пойти еще дальше, но это выходит за рамки этого.
источник
В отличном улучшении mvds есть две проблемы. Изменить код на это:
источник
Лучшее решение:
В NSData есть встроенная функция
источник
Рад, что людям понравилось. Конечная игра была немного испорчена, я должен признать. Помимо правильной установки inp = 0, вы должны либо увеличить размер tmpbuf до 3, например
или пропустите ряд необработанных [inp + 2]; если бы у нас был сырой [inp + 2]! = 0 для этого чанка, мы все равно были бы в цикле ...
В любом случае, для наглядности вы можете оставить блок поиска окончательной таблицы идентичным блоку в цикле. В финальной версии я использовал я сделал
Добавить ==
Извините, я не проверял RFC и прочее, должен был сделать лучшую работу!
источник
Под iOS8 и позже используйте
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
NSDataисточник
источник
Для обновления, чтобы использовать
NSData (NSDataBase64Encoding)
методы категории в iOS7 см. Мой ответ здесь: https://stackoverflow.com/a/18927627/1602729источник
Вот компактная версия Objective C как Категория на NSData. Нужно подумать о ...
При необходимости можно добавить заполнение, сделав область 'byt' шире и добавив 'dest' с (2-byt) символами "=" перед возвратом.
Затем можно добавить категорию в NSString, таким образом:
источник
iOS имеет встроенные методы кодирования и декодирования Base64 (без использования libresolv) начиная с iOS 4. Однако это было объявлено только в iOS 7 SDK. В документации Apple говорится, что вы можете использовать ее для iOS 4 и выше.
источник
Вот пример преобразования объекта NSData в Base 64. Здесь также показано, как пойти другим путем (декодировать объект NSData, закодированный в Base 64):
источник
в iOS 7
источник
Я сделал это, используя следующий класс ..
Во время звонка
Это оно...
источник
Я думаю, что это будет полезно
}
источник
Загрузить Base64
Выполните следующий код для преобразования изображения в base64
источник
Согласно вашему требованию я создал демонстрационную демонстрацию с использованием Swift 4, в которой вы можете кодировать / декодировать строку и изображение согласно вашему требованию.
Я также добавил примеры методов соответствующих операций.
источник