8

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

我可以毫不费力地将文件转换为 NSData 对象 - 但是我必须将其转换为一些 Base64 字符串。环境是 Mac OSX,Xcode 4.3。

我发现很多旧帖子都在处理这个问题——但我发现最好的是一些使用 OpenSSL 库的代码,其中包含大量不推荐使用的方法。

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

如果不是,我想有一些可以推荐的处理 Base64 的项目。毕竟 Base64 并不少见。

谢谢你的帮助!

4

4 回答 4

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);
}
于 2013-01-25T13:31:01.247 回答
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
于 2013-09-12T18:59:18.807 回答
3

这是我写的一个简单的NSData Base64 类别。它在底层使用 plist 序列化/反序列化机制。此外,欺骗雷达#9896929会很好。

于 2012-07-08T21:35:51.897 回答
2

这适用于 OSX,并且可以与从 10.6 到 10.8 的 SDK 一起使用。对于 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;
}
于 2014-04-23T08:51:43.723 回答