2012-07-08 16 views
8

Actualmente estoy tratando de hacer funcionar un pequeño cliente de soap, que incluye enviar un archivo de certificado dentro del xml de la solicitud.Cómo codificar y decodificar archivos como Base64 en Cocoa/Objective-C

No tengo problemas para obtener el archivo en un objeto NSData, pero luego tengo que convertirlo a Base64 String. El entorno es Mac OSX, Xcode 4.3.

He encontrado una gran cantidad de publicaciones antiguas que tratan con eso, pero lo mejor que encontré fue un código que hacía uso de las librerías de OpenSSL y contenía montones de métodos obsoletos.

Por lo tanto, mi pregunta es la siguiente: ¿Hay una mejor manera que utilizar las librerías OpenSSL? En caso afirmativo, ¿tiene alguna URL o restos de código más recientes?

Si no, supongo que hay algún proyecto que trate con Base64 que pueda ser recomendado. Después de todo, Base64 no es tan raro.

Gracias por su ayuda!

Respuesta

11

Aquí está una codificación base64 hecho con CommonCrypto:

se código muy fácil, no sería difícil ponerlo en una categoría

si se agrega esto a su proyecto en el que también hay que añadir Security.framework

#include <CoreFoundation/CoreFoundation.h> 
#include <Security/Security.h> 

static NSData *base64helper(NSData *input, SecTransformRef transform) 
{ 
    NSData *output = nil; 

    if (!transform) 
     return nil; 

    if (SecTransformSetAttribute(transform, kSecTransformInputAttributeName, input, NULL)) 
     output = (NSData *)SecTransformExecute(transform, NULL); 

    CFRelease(transform); 

    return [output autorelease]; 
} 

NSString *base64enc(NSData *input) 
{ 
    SecTransformRef transform = SecEncodeTransformCreate(kSecBase64Encoding, NULL); 

    return [[[NSString alloc] initWithData:base64helper(input, transform) encoding:NSASCIIStringEncoding] autorelease]; 
} 

NSData *base64dec(NSString *input) 
{ 
    SecTransformRef transform = SecDecodeTransformCreate(kSecBase64Encoding, NULL); 

    return base64helper([input dataUsingEncoding:NSASCIIStringEncoding], transform); 
} 
3

Aquí hay un simple NSData Base64 category que escribí. Utiliza el mecanismo de serialización/deserialización plist bajo el capó. Además, engañar radar #9896929 estaría bien.

+0

Gracias mucho. ¡Eso ayudará! –

+0

Al duplicar la entrada del radar, ¿quiere decir enviar esta una solicitud de función a Apple con una pista sobre la solución que proporcionó? –

+0

Acabo de integrar su código en mi pequeño proyecto y funciona como un encanto. Un buen truco con el ARC opcional. –

5

Si está utilizando iOS 7 u OS X 10.9 SDK, puede usar las nuevas capacidades de base64 de NSData.

Si está utilizando un SDK anterior, simplemente agregue esta declaración para obtener la codificación y decodificación NSData base64. Esto funcionará en iOS 4+ y OS X 10.7+.

#ifndef __IPHONE_7_0 
@interface NSData (NSDeprecated) 
- (id)initWithBase64Encoding:(NSString *)base64String NS_DEPRECATED(10_6, 10_9, 4_0, 7_0); 
- (NSString *)base64Encoding NS_DEPRECATED(10_6, 10_9, 4_0, 7_0); 
@end 
#endif 
2

Esto funciona para OSX y está bien usarlo con SDK's empezando desde 10.6 hasta 10.8. El 10,9 de los métodos han cambiado un poco (aunque en el momento de la escritura, que trabajan), pero está todo documentado en

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instm/NSData/base64Encoding

+ (NSString *) base64StringFromFileAtPath: (NSString*) filePath { 
    NSData * dataFromFile = [NSData dataWithContentsOfFile:filePath]; 
    return [dataFromFile base64Encoding]; 
} 


+ (NSData*) dataFrom64String : (NSString*) stringEncodedWithBase64 
{ 
    NSData *dataFromBase64 = [[NSData alloc] initWithBase64Encoding:stringEncodedWithBase64]; 
    return dataFromBase64; 
} 
+0

¡la mejor manera! gracias – Septronic

Cuestiones relacionadas