2012-07-08 29 views
8

Tôi hiện đang cố gắng để có được một khách hàng xà phòng nhỏ để làm việc, trong đó bao gồm để gửi một tập tin chứng chỉ trong xml của yêu cầu.Làm thế nào để mã hóa và giải mã tập tin như Base64 trong Cocoa/Objective-C

Tôi không gặp sự cố khi tải tệp vào đối tượng NSData - nhưng sau đó tôi phải chuyển đổi tệp đó thành một số chuỗi Base64. Môi trường là Mac OSX, Xcode 4.3.

Tôi đã tìm thấy rất nhiều bài đăng cũ hơn về điều đó - nhưng tốt nhất tôi tìm thấy là một số mã sử dụng lib OpenSSL và nơi chứa nhiều phương pháp không dùng nữa.

Vì vậy, câu hỏi của tôi là như sau: Có cách nào tốt hơn là sử dụng lib OpenSSL không? Nếu có, bạn có biết một số URL hoặc nhiều mã mới hơn không?

Nếu không, tôi đoán có một số dự án ngoài kia đề cập đến Base64 có thể được đề xuất. Sau khi tất cả Base64 không phải là không phổ biến.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

11

Đây là một mã hóa base64 thực hiện với CommonCrypto:

nó được mã rất dễ dàng, nó sẽ không khó khăn để đặt nó trong một thể loại

nếu bạn thêm video này vào dự án của bạn, bạn cũng cần phải thêm bảo mật.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

Đây là một đơn giản NSData Base64 category Tôi đã viết. Nó sử dụng cơ chế tuần tự hóa/deserialization plist dưới mui xe. Ngoài ra, duping radar #9896929 sẽ là tốt đẹp.

+0

Cảm ơn bạn rất nhiều. Điều đó có thể giúp bạn! –

+0

Với việc đánh lừa mục nhập radar, bạn có nghĩa là gửi yêu cầu tính năng này tới táo bằng gợi ý cho giải pháp bạn đã cung cấp? –

+0

Tôi chỉ tích hợp mã của bạn trong dự án nhỏ của tôi và nó hoạt động như một sự quyến rũ. Neat trick với ARC tùy ý. –

5

Nếu bạn đang sử dụng iOS 7 hoặc OS X 10.9 SDK, bạn có thể sử dụng khả năng cơ sở mới của NSData.

Nếu bạn đang sử dụng SDK cũ hơn, chỉ cần thêm tuyên bố này để nhận mã hóa và giải mã NSData base64. Điều này sẽ hoạt động trên iOS 4+ và 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

Tính năng này hoạt động với OSX và việc sử dụng SDK này bắt đầu từ 10.6 đến 10.8. Đối với 10.9 các phương pháp đã thay đổi một chút (mặc dù tại thời điểm viết bài, họ làm việc), nhưng tất cả tài liệu trên

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

cách tốt nhất! cảm ơn bạn – Septronic

Các vấn đề liên quan