2012-07-08 38 views
8

現在、小さなSOAPクライアントを動作させようとしています。これには、要求のxml内に証明書ファイルを送信することが含まれます。Cocoa/Objective-CでBase64としてファイルをエンコードおよびデコードする方法

私はファイルをNSDataオブジェクトに取得するのに問題はありませんが、それからいくつかのBase64 Stringに変換する必要があります。環境はMac OSX、Xcode 4.3です。

私はそれを扱っている古い投稿をたくさん見つけました。しかし、OpenSSLライブラリを使用していて、廃止予定のメソッドがたくさん含まれているコードがありました。

私の質問は以下の通りです: OpenSSLライブラリを使うよりも良い方法はありますか? 「はい」の場合、URLや最近のコードスクラップがありますか?

もしそうでなければ、推薦できるベース64を扱ういくつかのプロジェクトがあります。すべてのBase64はあまり一般的ではありません。

ありがとうございました!

答えて

11

がCommonCryptoで行わbase64エンコーディングです:

、それは非常に簡単にコードされ、あなたのプロジェクトにこれを追加する場合、追加することも必要カテゴリ

にそれを置くことは困難ではないでしょう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

私は書いた簡単なNSData Base64 categoryです。これは、ボンネットの下でplistシリアル化/逆シリアル化メカニズムを使用します。また、duping radar #9896929がいいでしょう。ここで

+0

レーダーの入力を取り消すと、あなたはあなたが提供した解決策へのヒントを持って、これに機能要求をアップルに提出することを意味するでしょうか? –

+0

小さなプロジェクトでコードを統合しただけで、魅力的に機能します。随意選択的ARCで巧みなトリック。 –

5

iOS 7またはOS X 10.9 SDKを使用している場合は、NSDataの新しいbase64機能を使用できます。

古いSDKを使用している場合は、この宣言を追加してNSData base64のエンコードとデコードを取得してください。これはiOS 4以降と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

これはOSXのために働く、それは10.6から10.8へのSDKの開始でこれを使用して大丈夫です。 (執筆時点で、彼らは仕事が)10.9のための方法が少し変わってきたが、それはすべてあなたにたくさんありがとうござい

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

最善の方法!ありがとうございました – Septronic

関連する問題