2012-07-08 100 views
8

我正在嘗試讓一個小型肥皂客戶端工作,其中包括在請求的xml內發送一個證書文件。如何在Cocoa中編碼和解碼文件爲Base64/Objective-C

我沒有問題將文件導入到一個NSData對象 - 但我必須將其轉換爲一些Base64字符串。環境是Mac OSX,Xcode 4.3。

我發現了很多舊的帖子處理 - 但我發現最好的是一些代碼,使用OpenSSL庫和其中包含負載的不贊成使用的方法。

所以,我的問題如下: 有沒有比使用OpenSSL庫更好的方法? 如果是的話,你是否有一些URL或更近的代碼廢料?

如果不是,我想有一些項目可以推薦使用Base64。畢竟Base64並不罕見。

感謝您的幫助!

回答

11

這裏是一個base64編碼進行CommonCrypto完成:

這是很容易的代碼,它不會是很難把它在一個類別

如果您添加到您的項目,你也需要添加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序列化/反序列化機制。此外,重複radar #9896929會很好。

+0

謝謝你很多。這將有助於! – 2012-07-09 18:51:04

+0

重複錄入雷達時,是指向蘋果提交此功能請求,並提供您提供的解決方案? – 2012-07-09 18:57:27

+0

我只是將你的代碼集成到我的小項目中,它就像一個魅力。與可選的意志ARC完美的技巧。 – 2012-07-09 19:24:40

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,它可以使用SDK從10.6到10.8。對於10.9的方法已經改變了一點(雖然在寫作的時候,他們的工作),但它的所有記錄上

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

最好的方法!謝謝 – Septronic 2015-11-02 00:26:49