Me gustaría base64
codificar y decodificar, pero no pude encontrar ningún soporte del iPhone SDK
. ¿Cómo puedo base64
codificar y decodificar con o sin una biblioteca?
ios
objective-c
base64
BlueDolphin
fuente
fuente
Respuestas:
Este es un buen caso de uso para las categorías del objetivo C .
Para codificación Base64:
Para decodificación Base64:
fuente
Una implementación realmente rápida que fue portada (y modificada / mejorada) de la biblioteca de PHP Core al código nativo de Objective-C está disponible en la clase QSStrings de la biblioteca QSUtilities . Hice un punto de referencia rápido: un archivo de imagen de 5,3 MB (JPEG) tardó <50 ms en codificarse y unos 140 ms en decodificarse.
El código para toda la biblioteca (incluidos los métodos Base64) está disponible en GitHub .
O, alternativamente, si desea que el código solo contenga los métodos Base64, lo he publicado aquí:
Primero, necesita las tablas de mapeo:
Para codificar:
Para decodificar:
fuente
strResult
en el codificador parece estar perdida; solo necesita unfree()
al final (antes de regresar pero despuésNSString stringWithCString
)encodeBase64WithData:
método, ¿el primer parámetro de la llamada nocalloc()
necesita incrementarse en 1 para tener en cuenta el terminador nulo ('\0'
) que agrega al final?Históricamente, lo habríamos dirigido a una de las muchas bibliotecas de base 64 de terceros (como se discutió en las otras respuestas) para convertir de datos binarios a cadenas de base 64 (y viceversa), pero iOS 7 ahora tiene codificación nativa de base 64 (y expone los métodos de iOS 4 previamente privados, en caso de que necesite admitir versiones anteriores de iOS).
Por lo tanto, para convertir
NSData
a laNSString
representación base 64, puede usarbase64EncodedStringWithOptions
. Si también debe admitir versiones de iOS anteriores a la 7.0, puede hacer lo siguiente:Y para convertir la base 64 de
NSString
nuevo aNSData
usted puede usarinitWithBase64EncodedString
. Del mismo modo, si necesita admitir versiones de iOS anteriores a la 7.0, puede hacer lo siguiente:Obviamente, si no necesita compatibilidad con versiones anteriores de iOS anteriores a 7.0, es aún más fácil, simplemente use
base64EncodedStringWithOptions
oinitWithBase64EncodedString
, respectivamente, y no se moleste con la verificación del tiempo de ejecución para versiones anteriores de iOS. De hecho, si usa el código anterior cuando su objetivo mínimo es iOS 7 o superior, en realidad obtendrá una advertencia del compilador sobre los métodos obsoletos. Entonces, en iOS 7 y versiones posteriores, simplemente convertiría a una cadena base 64 con:y de regreso con:
fuente
iOS incluye soporte incorporado para codificación y decodificación base64. Si nos fijamos
resolv.h
, debería ver las dos funcionesb64_ntop
yb64_pton
. El zócalo cuadrado biblioteca proporciona un ejemplo razonable de cómo usar estas funciones desde el objetivo-c.Estas funciones están bastante probadas y son confiables, a diferencia de muchas de las implementaciones que puede encontrar en publicaciones aleatorias en Internet. No te olvides de enlazar en contra
libresolv.dylib
.fuente
Dado que este parece ser el éxito número uno de Google en la codificación base64 y el iPhone, tuve ganas de compartir mi experiencia con el fragmento de código anterior.
Funciona, pero es extremadamente lento. Un punto de referencia en una imagen aleatoria (0.4 mb) tomó 37 segundos en el iPhone nativo. La razón principal es probablemente toda la magia OOP: NSStrings de un solo carácter, etc., que solo se liberan automáticamente después de que se realiza la codificación.
Otra sugerencia publicada aquí (ab) usa la biblioteca openssl, que también parece exagerada.
El siguiente código tarda 70 ms, es decir, una aceleración de 500 veces. Esto solo hace codificación base64 (la decodificación seguirá tan pronto como la encuentre)
Dejé el corte de línea ya que no lo necesitaba, pero es trivial agregarlo.
Para aquellos que estén interesados en optimizar: el objetivo es minimizar lo que sucede en el ciclo principal. Por lo tanto, toda la lógica para tratar con los últimos 3 bytes se trata fuera del ciclo.
Además, intente trabajar con datos en el lugar, sin copia adicional a / desde buffers. Y reduzca cualquier aritmética al mínimo.
Observe que los bits que se juntan para buscar una entrada en la tabla no se superpondrían cuando debían juntarse sin cambiar. Por lo tanto, una mejora importante podría ser usar 4 tablas de búsqueda de 256 bytes separadas y eliminar los cambios, de esta manera:
Por supuesto, podría llevarlo mucho más lejos, pero eso está más allá del alcance aquí.
fuente
En la excelente mejora de mvds, hay dos problemas. Cambie el código a esto:
fuente
Mejor solucion:
Hay una función incorporada en NSData
fuente
Me alegra que a la gente le haya gustado. El final del juego fue un poco defectuoso, debo admitir. Además de establecer correctamente inp = 0, también deberías aumentar el tamaño de tmpbuf a 3, como
o dejar de lado el orring de raw [inp + 2]; si tuviéramos un [inp + 2] sin procesar! = 0 para este fragmento, todavía estaríamos en el ciclo, por supuesto ...
De cualquier manera funciona, puede considerar mantener el bloque de búsqueda de la tabla final idéntico al del bucle para mayor claridad. En la versión final que usé hice
Para agregar el ==
Lo siento, no revisé los RFC y esas cosas, ¡debería haber hecho un mejor trabajo!
fuente
Bajo iOS8 y uso posterior
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
de NSDatafuente
fuente
Para obtener una actualización para usar los
NSData (NSDataBase64Encoding)
métodos de categoría en iOS7, vea mi respuesta aquí: https://stackoverflow.com/a/18927627/1602729fuente
Aquí hay una versión compacta de Objective-C como categoría en NSData. Se necesita pensar un poco sobre ...
Se puede agregar relleno si es necesario ampliando el alcance de 'byt' y agregando 'dest' con caracteres (2-byt) "=" antes de regresar.
Luego se puede agregar una Categoría a NSString, por lo tanto:
fuente
iOS ha incorporado métodos de codificación y decodificación Base64 (sin usar libresolv) desde iOS 4. Sin embargo, solo se declaró en el SDK de iOS 7. La documentación de Apple indica que puede usarlo cuando apunta a iOS 4 y superior.
fuente
Aquí hay un ejemplo para convertir un objeto NSData a Base 64. También muestra cómo ir al otro lado (decodificar un objeto NSData codificado en base 64):
fuente
en iOS 7
fuente
Lo he hecho usando la siguiente clase ...
Mientras llamaba llame
Eso es...
fuente
Creo que esto será útil
}
fuente
Descargar Base64
Haga el siguiente código para convertir una imagen a base64
fuente
Según sus requisitos, he creado una demostración de muestra usando Swift 4 en la que puede codificar / decodificar cadenas e imágenes según sus requisitos.
También he agregado métodos de muestra de operaciones relevantes.
fuente