8
votes

Comment encoder et décoder des fichiers comme base64 dans cacao / objectif-c

J'essaie actuellement d'obtenir un petit client SOAP à travailler, ce qui inclut d'envoyer un fichier de certificat dans le XML de la demande.

Je n'ai aucun problème à obtenir le fichier dans un objet Nsdata - mais je dois ensuite le convertir en une chaîne de base64. L'environnement est Mac OSX, Xcode 4.3.

J'ai trouvé beaucoup de postes plus âgés avec cela - mais le meilleur que j'ai trouvé était un code qui utilise OpenSSL Libs et où contenant des charges de méthodes obsolètes.

Alors, ma question est la suivante: Y a-t-il un meilleur moyen que d'utiliser les libs OpenSSL? Si oui, avez-vous une perchage avoir une URL ou des restes de code plus récents?

Si non, je suppose qu'il y a un projet là-bas qui traite de la base64 qui peut être recommandé. Après que tout base64 ne soit pas rare.

Merci pour votre aide!


0 commentaires

4 Réponses :


3
votes

voici un simple Nsdata Base64 catégorie j'ai écrit. Il utilise le mécanisme de sérialisation / de désérialisation du plis sous la hotte. En outre, DuPing Radar # 9896929 serait bien.


3 commentaires

Merci beaucoup. Ça va aider!


Avec DuPing l'entrée radar, vous voulez dire que cela a une demande de fonctionnalité à Apple avec une allusion à la solution que vous avez fournie?


Je viens d'introduire votre code dans mon petit projet et cela fonctionne comme un charme. Trick soigné avec l'arc éventuellement menacé.



11
votes

Voici un codage de base64 fait avec communCrypto:

C'est un code très facile, il ne serait pas difficile de le mettre dans une catégorie p>

Si vous ajoutez ceci à votre projet, vous devez également Ajouter le Security.framework P>

#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);
}


0 commentaires

5
votes

Si vous utilisez le SDK iOS 7 ou OS X 10.9, vous pouvez utiliser les nouvelles fonctionnalités de base64 de Nsdata.

Si vous utilisez un SDK plus ancien, ajoutez simplement cette déclaration pour obtenir le codage et le décodage de Nsdata Base64. Cela fonctionnera sur iOS 4+ et OS X 10.7 +. P>

#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


0 commentaires

2
votes

Ceci fonctionne pour OSX et c'est OK en utilisant cela avec SDK à partir de 10,6 à 10.8. Pour 10.9, les méthodes ont changé un peu (bien qu'au moment de la rédaction, elles fonctionnent), mais tout est documenté sur

https://developer.apple.com/library/mac/documentation/cocoa /Reference/foundation/classes/nsdata_class/deprecationAppendix/appendixadePrecatedapi.html#//apple_ref/ocrection6444Coding P>

+ (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 commentaires