将NSData转换为base64

mac*_*ent 38 iphone base64 nsdata

如何转换NSDatabase64.我有NSData并希望转换成base64我该怎么做?

Ken*_*Ken 50

编辑

从OS X 10.9/iOS 7开始,它内置于框架中.

看到 -[NSData base64EncodedDataWithOptions:]


在iOS7/OS X 10.9之前:

Matt Gallagher写了一篇关于这个主题的文章.在底部,他给出了他的iPhone可嵌入代码的链接.

在Mac上你可以使用OpenSSL库,在iPhone上他自己编写了impl.

  • 在Matts代码中似乎存在一个小问题:在`void*NewBase64Decode`第128行,`j + = accumulateIndex - 1;`必须用`if(cumulativeIndex> 0){...}`包围.否则,如果编码流在末尾包含无效(例如"\ r \n")字符,则解码文本的最后一个字符可能会丢失.这导致我的代码执行基于行的IMAP响应解码的奇怪问题... (2认同)

jos*_*hrl 27

//from: http://cocoadev.com/BaseSixtyFour
+ (NSString*)base64forData:(NSData*)theData {

    const uint8_t* input = (const uint8_t*)[theData bytes];
    NSInteger length = [theData length];

  static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

  NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
  uint8_t* output = (uint8_t*)data.mutableBytes;

    NSInteger i;
  for (i=0; i < length; i += 3) {
    NSInteger value = 0;
        NSInteger j;
    for (j = i; j < (i + 3); j++) {
      value <<= 8;

      if (j < length) {
        value |= (0xFF & input[j]);
      }
    }

    NSInteger theIndex = (i / 3) * 4;
    output[theIndex + 0] =                    table[(value >> 18) & 0x3F];
    output[theIndex + 1] =                    table[(value >> 12) & 0x3F];
    output[theIndex + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
    output[theIndex + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';
  }

  return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
}
Run Code Online (Sandbox Code Playgroud)


Dam*_*fex 20

作为更新,iOS7 SDK上有一个NSData (NSDataBase64Encoding)带有方法的类别

-[NSData base64EncodedStringWithOptions:]
-[NSData initWithBase64EncodedString:options:]
-[NSData initWithBase64EncodedData:options:]
-[NSData base64EncodedDataWithOptions:]
Run Code Online (Sandbox Code Playgroud)

应避免必须滚动自己的类别方法


Ben*_*her 6

这里有超级简单的Google库代码.

只需使用+rfc4648Base64StringEncoding获取实例,然后使用encode/ decodefunctions.

这是一件美好的事情.(不要忘记GTMDefines.h从根目录中获取头文件和头部.)