2012-07-08 15 views
8

Attualmente sto cercando di far funzionare un piccolo client soap, che include l'invio di un file di certificato all'interno dell'xml della richiesta.Come codificare e decodificare i file come Base64 in Cocoa/Objective-C

Non ho problemi a recuperare il file in un oggetto NSData, ma devo convertirlo in una stringa Base64. L'ambiente è Mac OSX, Xcode 4.3.

Ho trovato molti post più vecchi che trattano di questo, ma il meglio che ho trovato era un codice che faceva uso di librerie OpenSSL e dove conteneva molti metodi deprecati.

Quindi, la mia domanda è la seguente: C'è un modo migliore di usare le librerie OpenSSL? Se sì, hai qualche URL o più scrap recenti di codice?

Se no, immagino ci sia qualche progetto là fuori che si occupa di Base64 che può essere raccomandato. Dopo tutto Base64 non è così raro.

Grazie per il vostro aiuto!

risposta

11

Ecco una codifica Base64 fatto con CommonCrypto:

è molto facile codice, non sarebbe difficile metterlo in una categoria

se si aggiunge questo al progetto è necessario anche aggiungere the 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

Ecco un semplice NSData Base64 category che ho scritto. Utilizza il meccanismo di serializzazione/deserializzazione plist sotto il cofano. Inoltre, l'ingannare radar #9896929 sarebbe bello.

+0

Grazie molto. Questo aiuterà! –

+0

Con l'operazione di duplicazione della voce radar, si intende inviare una richiesta di funzionalità a Apple con un suggerimento per la soluzione fornita? –

+0

Ho appena integrato il codice nel mio piccolo progetto e funziona come un fascino. Trucchetto pulito con l'ARC opzionale. –

5

Se si utilizza l'SDK di iOS 7 o OS X 10.9, è possibile utilizzare le nuove funzionalità di base64 di NSData.

Se si utilizza un SDK precedente, aggiungere questa dichiarazione per ottenere la codifica e la decodifica base64 NSData. Funzionerà su iOS 4+ e 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

Questo funziona per OSX e va bene usando questo con gli SDK a partire da 10.6 a 10.8. Per 10.9 i metodi sono cambiati un po '(anche se al momento della scrittura, funzionano), ma è tutto documentato sul

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

modo migliore! grazie – Septronic

Problemi correlati