【问题标题】:How to encode and decode Files as Base64 in Cocoa / Objective-C如何在 Cocoa / Objective-C 中将文件编码和解码为 Base64
【发布时间】:2012-07-08 08:51:15
【问题描述】:

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

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

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: objective-c cocoa base64 xcode4.3


    【解决方案1】:

    这适用于 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;
    }
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 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
      

      【讨论】:

        【解决方案3】:

        这是使用 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);
        }
        

        【讨论】:

          【解决方案4】:

          这是我写的一个简单的NSData Base64 category。它在底层使用 plist 序列化/反序列化机制。另外,欺骗radar #9896929 也不错。

          【讨论】:

          • 非常感谢。这会有所帮助!
          • 通过复制雷达条目,您的意思是向苹果提交一个功能请求,并提示您提供的解决方案?
          • 我刚刚将您的代码集成到我的小项目中,它就像一个魅力。使用可选思维 ARC 的巧妙技巧。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-01
          • 2012-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-24
          • 2019-07-02
          相关资源
          最近更新 更多