如何在Cocoa/Objective-C中将文件编码和解码为Base64

Kai*_*ern 8 cocoa base64 objective-c xcode4.3

我目前正在尝试让一个小型肥皂客户端工作,其中包括在请求的xml中发送证书文件.

我将文件导入NSData对象没有问题 - 但我必须将其转换为某些Base64字符串.环境是Mac OSX,Xcode 4.3.

我发现很多旧的帖子都在处理 - 但我发现最好的是一些使用OpenSSL库的代码,其中包含大量已弃用的方法.

所以,我的问题如下:有没有比使用OpenSSL库更好的方法?如果是,您是否有一些URL或更新的代码片段?

如果不是,我想有一些项目可以推荐使用Base64.毕竟Base64并不罕见.

谢谢你的帮助!

den*_*342 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);
}
Run Code Online (Sandbox Code Playgroud)


0xc*_*ced 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
Run Code Online (Sandbox Code Playgroud)