将NSData转换为base64

如何将NSData转换为base64 。 我有NSData ,想要转换成base64 ,我怎么能做到这一点?

编辑

从OS X 10.9 / iOS 7开始,这是内置于框架中的。

请参阅-[NSData base64EncodedDataWithOptions:]


在iOS7 / OS X 10.9之前:

马特·加拉格尔就这个话题写了一篇文章 。 在底部,他给出了一个链接到他的embedded式iPhone代码。

在Mac上你可以使用OpenSSL库,在iPhone上写他自己的impl。

 //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]; } 

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

 -[NSData base64EncodedStringWithOptions:] -[NSData initWithBase64EncodedString:options:] -[NSData initWithBase64EncodedData:options:] -[NSData base64EncodedDataWithOptions:] 

应该避免不得不推出自己的类别方法

超级简单的下拉谷歌库代码在这里。

只需使用+rfc4648Base64StringEncoding来获得一个实例,然后使用encode / decodefunction。

这是一件美丽的事情。 (不要忘了从根目录获取头文件和GTMDefines.h头文件)

这并不容易。 因为在c或obj-c中没有内置的支持。 以下是我在做什么(基本上是让CL为我做的):

 - (NSString *)_base64Encoding:(NSString *) str { NSTask *task = [[[NSTask alloc] init] autorelease]; NSPipe *inPipe = [NSPipe pipe], *outPipe = [NSPipe pipe]; NSFileHandle *inHandle = [inPipe fileHandleForWriting], *outHandle = [outPipe fileHandleForReading]; NSData *outData = nil; [task setLaunchPath:@"/usr/bin/openssl"]; [task setArguments:[NSArray arrayWithObjects:@"base64", @"-e", nil]]; [task setStandardInput:inPipe]; [task setStandardOutput:outPipe]; [task setStandardError:outPipe]; [task launch]; [inHandle writeData:[str dataUsingEncoding: NSASCIIStringEncoding]]; [inHandle closeFile]; [task waitUntilExit]; outData = [outHandle readDataToEndOfFile]; if (outData) { NSString *base64 = [[[NSString alloc] initWithData:outData encoding:NSUTF8StringEncoding] autorelease]; if (base64) return base64; } return nil; } 

你这样使用它:

 NSString *b64str = [strToConvert _base64Encoding:strToConvert]; 

这不是我的代码 – 我在这里find它: http : //www.cocoadev.com/index.pl?BaseSixtyFour它工作的很好。 你总是可以把它变成一个+()方法。

哦,并且让你的NSData到这个方法的NSString:

 NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 

iOS始终包含内置的对base64编码和解码的支持。 如果你看看resolv.h你应该看到两个函数b64_ntopb64_pton 。 Square SocketRocket库提供了一个合理的例子来说明如何使用objective-c中的这些函数。

这些function都经过很好的testing和可靠的 – 不像你在随机的互联网上发现的许多实现。 不要忘记链接到libresolv.dylib

如果您链接到iOS 7 SDK,则可以使用更新的方法initWithBase64Encoding:base64EncodedDataWithOptions: 这些存在于以前的版本中,但是是私有的。 所以如果你连接到6 SDK,你可能会遇到未定义的行为。 这将是一个如何使用这个只是当连接到7 SDK的例子:

 #ifndef __IPHONE_7_0 // oh no! you are using something unsupported! // Call and implementation that uses b64_pton here #else data = [[NSData alloc] initWithBase64Encoding:string]; #endif 

我修改了上面的代码来满足我的需求,build立一个HTTP POST。 我能够跳过NSString步骤,并在BASE64代码中包含换行符,至less有一个Web服务器更适合:

 #define LINE_SIZE 76 //originally from: http://www.cocoadev.com/index.pl?BaseSixtyFour // via joshrl on stockoverflow - (void) appendBase64Of: (NSData *)inData to:(NSMutableData *)outData { const uint8_t* input = (const uint8_t*)[inData bytes]; NSInteger length = [inData length]; static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; uint8_t buf[LINE_SIZE + 4 + 2]; size_t n = 0; 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]); } } buf[n + 0] = table[(value >> 18) & 0x3F]; buf[n + 1] = table[(value >> 12) & 0x3F]; buf[n + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; buf[n + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; n += 4; if (n + 2 >= LINE_SIZE) { buf[n++] = '\r'; buf[n++] = '\n'; [outData appendBytes:buf length:n]; n = 0; } } if (n > 0) { buf[n++] = '\r'; buf[n++] = '\n'; [outData appendBytes:buf length:n]; } return; }