我如何做iphone-sdk的base64编码?
我想做base64
编码和解码,但是我找不到iPhone SDK
任何支持。 怎样才能在有或没有库的情况下进行base64
编码和解码?
这篇文章的底部有一个很好的代码示例。 非常独立…
BaseSixtyFour
Objective C 类别是一个很好的用例。
对于Base64编码:
#import <Foundation/NSString.h> @interface NSString (NSStringAdditions) + (NSString *) base64StringFromData:(NSData *)data length:(int)length; @end ------------------------------------------- #import "NSStringAdditions.h" static char base64EncodingTable[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; @implementation NSString (NSStringAdditions) + (NSString *) base64StringFromData: (NSData *)data length: (int)length { unsigned long ixtext, lentext; long ctremaining; unsigned char input[3], output[4]; short i, charsonline = 0, ctcopy; const unsigned char *raw; NSMutableString *result; lentext = [data length]; if (lentext < 1) return @""; result = [NSMutableString stringWithCapacity: lentext]; raw = [data bytes]; ixtext = 0; while (true) { ctremaining = lentext - ixtext; if (ctremaining <= 0) break; for (i = 0; i < 3; i++) { unsigned long ix = ixtext + i; if (ix < lentext) input[i] = raw[ix]; else input[i] = 0; } output[0] = (input[0] & 0xFC) >> 2; output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4); output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6); output[3] = input[2] & 0x3F; ctcopy = 4; switch (ctremaining) { case 1: ctcopy = 2; break; case 2: ctcopy = 3; break; } for (i = 0; i < ctcopy; i++) [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; for (i = ctcopy; i < 4; i++) [result appendString: @"="]; ixtext += 3; charsonline += 4; if ((length > 0) && (charsonline >= length)) charsonline = 0; } return result; } @end
对于Base64解码:
#import <Foundation/Foundation.h> @class NSString; @interface NSData (NSDataAdditions) + (NSData *) base64DataFromString:(NSString *)string; @end ------------------------------------------- #import "NSDataAdditions.h" @implementation NSData (NSDataAdditions) + (NSData *)base64DataFromString: (NSString *)string { unsigned long ixtext, lentext; unsigned char ch, inbuf[4], outbuf[3]; short i, ixinbuf; Boolean flignore, flendtext = false; const unsigned char *tempcstring; NSMutableData *theData; if (string == nil) { return [NSData data]; } ixtext = 0; tempcstring = (const unsigned char *)[string UTF8String]; lentext = [string length]; theData = [NSMutableData dataWithCapacity: lentext]; ixinbuf = 0; while (true) { if (ixtext >= lentext) { break; } ch = tempcstring [ixtext++]; flignore = false; if ((ch >= 'A') && (ch <= 'Z')) { ch = ch - 'A'; } else if ((ch >= 'a') && (ch <= 'z')) { ch = ch - 'a' + 26; } else if ((ch >= '0') && (ch <= '9')) { ch = ch - '0' + 52; } else if (ch == '+') { ch = 62; } else if (ch == '=') { flendtext = true; } else if (ch == '/') { ch = 63; } else { flignore = true; } if (!flignore) { short ctcharsinbuf = 3; Boolean flbreak = false; if (flendtext) { if (ixinbuf == 0) { break; } if ((ixinbuf == 1) || (ixinbuf == 2)) { ctcharsinbuf = 1; } else { ctcharsinbuf = 2; } ixinbuf = 3; flbreak = true; } inbuf [ixinbuf++] = ch; if (ixinbuf == 4) { ixinbuf = 0; outbuf[0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4); outbuf[1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2); outbuf[2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F); for (i = 0; i < ctcharsinbuf; i++) { [theData appendBytes: &outbuf[i] length: 1]; } } if (flbreak) { break; } } } return theData; } @end
一个非常快速的实现,从QBase库的QSStrings类中 ,可以从PHP Core库移植到原生的Objective-C代码中(可以修改/改进)。 我做了一个快速的基准:一个5.3MB的图像(JPEG)文件需要<50ms编码,约140ms解码。
整个库(包括Base64方法)的代码都可以在GitHub上find 。
或者,如果你想要代码只是 Base64方法本身,我已经发布在这里:
首先,你需要映射表:
static const char _base64EncodingTable[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const short _base64DecodingTable[256] = { -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, -2, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2 };
编码:
+ (NSString *)encodeBase64WithString:(NSString *)strData { return [QSStrings encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]]; } + (NSString *)encodeBase64WithData:(NSData *)objData { const unsigned char * objRawData = [objData bytes]; char * objPointer; char * strResult; // Get the Raw Data length and ensure we actually have data int intLength = [objData length]; if (intLength == 0) return nil; // Setup the String-based Result placeholder and pointer within that placeholder strResult = (char *)calloc((((intLength + 2) / 3) * 4) + 1, sizeof(char)); objPointer = strResult; // Iterate through everything while (intLength > 2) { // keep going until we have less than 24 bits *objPointer++ = _base64EncodingTable[objRawData[0] >> 2]; *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)]; *objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)]; *objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f]; // we just handled 3 octets (24 bits) of data objRawData += 3; intLength -= 3; } // now deal with the tail end of things if (intLength != 0) { *objPointer++ = _base64EncodingTable[objRawData[0] >> 2]; if (intLength > 1) { *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)]; *objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2]; *objPointer++ = '='; } else { *objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4]; *objPointer++ = '='; *objPointer++ = '='; } } // Terminate the string-based result *objPointer = '\0'; // Create result NSString object NSString *base64String = [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding]; // Free memory free(strResult); return base64String; }
解码:
+ (NSData *)decodeBase64WithString:(NSString *)strBase64 { const char *objPointer = [strBase64 cStringUsingEncoding:NSASCIIStringEncoding]; size_t intLength = strlen(objPointer); int intCurrent; int i = 0, j = 0, k; unsigned char *objResult = calloc(intLength, sizeof(unsigned char)); // Run through the whole string, converting as we go while ( ((intCurrent = *objPointer++) != '\0') && (intLength-- > 0) ) { if (intCurrent == '=') { if (*objPointer != '=' && ((i % 4) == 1)) {// || (intLength > 0)) { // the padding character is invalid at this point -- so this entire string is invalid free(objResult); return nil; } continue; } intCurrent = _base64DecodingTable[intCurrent]; if (intCurrent == -1) { // we're at a whitespace -- simply skip over continue; } else if (intCurrent == -2) { // we're at an invalid character free(objResult); return nil; } switch (i % 4) { case 0: objResult[j] = intCurrent << 2; break; case 1: objResult[j++] |= intCurrent >> 4; objResult[j] = (intCurrent & 0x0f) << 4; break; case 2: objResult[j++] |= intCurrent >>2; objResult[j] = (intCurrent & 0x03) << 6; break; case 3: objResult[j++] |= intCurrent; break; } i++; } // mop things up if we ended on a boundary k = j; if (intCurrent == '=') { switch (i % 4) { case 1: // Invalid state free(objResult); return nil; case 2: k++; // flow through case 3: objResult[k] = 0; } } // Cleanup and setup the return NSData NSData * objData = [[[NSData alloc] initWithBytes:objResult length:j] autorelease]; free(objResult); return objData; }
从历史上看,我们将会把你引导到众多的第三方base64库(正如在其他答案中所讨论的),以便从二进制数据转换为base64string(而后者),但是iOS7现在具有本地base64编码公开以前的私人iOS 4方法,以防需要支持早期版本的iOS)。
因此,要将NSData
转换为NSString
base 64表示forms,可以使用base64EncodedStringWithOptions
。 如果您必须支持7.0之前的iOS版本,则可以执行以下操作:
NSString *string; if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) { string = [data base64EncodedStringWithOptions:kNilOptions]; // iOS 7+ } else { string = [data base64Encoding]; // pre iOS7 }
而要将base 64 NSString
转换回NSData
您可以使用initWithBase64EncodedString
。 同样,如果您需要支持7.0以前的iOS版本,则可以执行以下操作:
NSData *data; if ([NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]) { data = [[NSData alloc] initWithBase64EncodedString:string options:kNilOptions]; // iOS 7+ } else { data = [[NSData alloc] initWithBase64Encoding:string]; // pre iOS7 }
很显然,如果你不需要向前兼容7.0之前的iOS版本,那么更简单,只需要分别使用base64EncodedStringWithOptions
或者initWithBase64EncodedString
,而不用担心早期iOS版本的运行时检查。 实际上,如果您在最低目标是iOS 7或更高版本的情况下使用上述代码,则实际上会得到有关已弃用方法的编译器警告。 因此,在iOS 7及更高版本中,您只需将以下string转换为基本64string:
NSString *string = [data base64EncodedStringWithOptions:kNilOptions];
然后再回来:
NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:kNilOptions];
iOS内置支持base64编码和解码。 如果你看看resolv.h
你应该看到两个函数b64_ntop
和b64_pton
。 Square SocketRocket库提供了一个合理的例子来说明如何使用objective-c中的这些函数。
这些function都经过很好的testing和可靠的 – 不像你在随机的互联网上发现的许多实现。 不要忘记链接到libresolv.dylib
。
因为这似乎是谷歌打base64编码和iPhone的头号,我觉得像上面的代码片段分享我的经验。
它有效,但速度非常慢。 一个随机图像(0.4 MB)的基准在原生iPhone上花了37秒。 主要原因可能是所有的OOP魔术 – 单字符NSStrings等,它们只是在编码完成后自动释放。
在这里发布的另一个build议(ab)使用openssl库,这也感觉像是过度杀毒。
下面的代码需要70毫秒 – 这是一个500倍的加速。 这只是base64编码(解码将尽快我遇到它)
+ (NSString *) base64StringFromData: (NSData *)data length: (int)length { int lentext = [data length]; if (lentext < 1) return @""; char *outbuf = malloc(lentext*4/3+4); // add 4 to be sure if ( !outbuf ) return nil; const unsigned char *raw = [data bytes]; int inp = 0; int outp = 0; int do_now = lentext - (lentext%3); for ( outp = 0, inp = 0; inp < do_now; inp += 3 ) { outbuf[outp++] = base64EncodingTable[(raw[inp] & 0xFC) >> 2]; outbuf[outp++] = base64EncodingTable[((raw[inp] & 0x03) << 4) | ((raw[inp+1] & 0xF0) >> 4)]; outbuf[outp++] = base64EncodingTable[((raw[inp+1] & 0x0F) << 2) | ((raw[inp+2] & 0xC0) >> 6)]; outbuf[outp++] = base64EncodingTable[raw[inp+2] & 0x3F]; } if ( do_now < lentext ) { char tmpbuf[2] = {0,0}; int left = lentext%3; for ( int i=0; i < left; i++ ) { tmpbuf[i] = raw[do_now+i]; } raw = tmpbuf; outbuf[outp++] = base64EncodingTable[(raw[inp] & 0xFC) >> 2]; outbuf[outp++] = base64EncodingTable[((raw[inp] & 0x03) << 4) | ((raw[inp+1] & 0xF0) >> 4)]; if ( left == 2 ) outbuf[outp++] = base64EncodingTable[((raw[inp+1] & 0x0F) << 2) | ((raw[inp+2] & 0xC0) >> 6)]; } NSString *ret = [[[NSString alloc] initWithBytes:outbuf length:outp encoding:NSASCIIStringEncoding] autorelease]; free(outbuf); return ret; }
因为我不需要它,所以我省去了切割线,但是添加它很简单。
对于那些有兴趣优化的人来说:目标是尽量减less主循环中发生的事情。 因此,处理最后3个字节的所有逻辑都在循环之外处理。
此外,尝试就地处理数据,而不额外复制到/从缓冲区。 并减less任何算术的最低限度。
要注意的是,一起组合起来查找表中的一个条目的位不会在重叠而没有移位的情况下重叠。 因此,一个主要的改进可能是使用4个独立的256字节的查找表并消除这种变化,如下所示:
outbuf[outp++] = base64EncodingTable1[(raw[inp] & 0xFC)]; outbuf[outp++] = base64EncodingTable2[(raw[inp] & 0x03) | (raw[inp+1] & 0xF0)]; outbuf[outp++] = base64EncodingTable3[(raw[inp+1] & 0x0F) | (raw[inp+2] & 0xC0)]; outbuf[outp++] = base64EncodingTable4[raw[inp+2] & 0x3F];
当然,你可以进一步了解更多,但这超出了这个范围。
在mvds的优秀改进中,存在两个问题。 将代码更改为:
raw = tmpbuf; inp = 0; outbuf[outp++] = base64EncodingTable[(raw[inp] & 0xFC) >> 2]; outbuf[outp++] = base64EncodingTable[((raw[inp] & 0x03) << 4) | ((raw[inp+1] & 0xF0) >> 4)]; if ( left == 2 ) outbuf[outp++] = base64EncodingTable[((raw[inp+1] & 0x0F) << 2) | ((raw[inp+2] & 0xC0) >> 6)]; else outbuf[outp++] = '='; outbuf[outp++] = '=';
更好的scheme:
在NSData中有一个内置函数
[data base64Encoding]; //iOS < 7.0 [data base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; //iOS >= 7.0
很高兴的人喜欢它。 我必须承认,最后的比赛有点有缺陷。 除了正确设置inp = 0之外,还应该将tmpbuf的大小增加到3
unsigned char tmpbuf[3] = {0,0,0};
或者省去原料[inp + 2]; 如果我们有一个raw [inp + 2]!= 0的块,我们仍然会在循环中…
无论哪种方式,你可能会考虑保持最终表查找块相同的循环清晰。 在我使用的最终版本中,我做到了
while ( outp%4 ) outbuf[outp++] = '=';
添加==
对不起,我没有检查RFC的东西,应该做得更好!
在iOS8及以后的版本中,使用- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
的NSData
#import "NSDataAdditions.h" @implementation NSData (NSDataAdditions) + (NSData *) base64DataFromString: (NSString *)string { unsigned long ixtext, lentext; unsigned char ch, input[4], output[3]; short i, ixinput; Boolean flignore, flendtext = false; const char *temporary; NSMutableData *result; if (!string) return [NSData data]; ixtext = 0; temporary = [string UTF8String]; lentext = [string length]; result = [NSMutableData dataWithCapacity: lentext]; ixinput = 0; while (true) { if (ixtext >= lentext) break; ch = temporary[ixtext++]; flignore = false; if ((ch >= 'A') && (ch <= 'Z')) ch = ch - 'A'; else if ((ch >= 'a') && (ch <= 'z')) ch = ch - 'a' + 26; else if ((ch >= '0') && (ch <= '9')) ch = ch - '0' + 52; else if (ch == '+') ch = 62; else if (ch == '=') flendtext = true; else if (ch == '/') ch = 63; else flignore = true; if (!flignore) { short ctcharsinput = 3; Boolean flbreak = false; if (flendtext) { if (ixinput == 0) break; if ((ixinput == 1) || (ixinput == 2)) ctcharsinput = 1; else ctcharsinput = 2; ixinput = 3; flbreak = true; } input[ixinput++] = ch; if (ixinput == 4){ ixinput = 0; output[0] = (input[0] << 2) | ((input[1] & 0x30) >> 4); output[1] = ((input[1] & 0x0F) << 4) | ((input[2] & 0x3C) >> 2); output[2] = ((input[2] & 0x03) << 6) | (input[3] & 0x3F); for (i = 0; i < ctcharsinput; i++) [result appendBytes: &output[i] length: 1]; } if (flbreak) break; } } return result; } @end
对于在iOS7中使用NSData (NSDataBase64Encoding)
类别方法的更新,请参阅我的答案: https ://stackoverflow.com/a/18927627/1602729
这里有一个紧凑的Objective-C版本作为NSData上的一个类别。 这需要考虑一些…
@implementation NSData (DataUtils) static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - (NSString *)newStringInBase64FromData { NSMutableString *dest = [[NSMutableString alloc] initWithString:@""]; unsigned char * working = (unsigned char *)[self bytes]; int srcLen = [self length]; // tackle the source in 3's as conveniently 4 Base64 nibbles fit into 3 bytes for (int i=0; i<srcLen; i += 3) { // for each output nibble for (int nib=0; nib<4; nib++) { // nibble:nib from char:byt int byt = (nib == 0)?0:nib-1; int ix = (nib+1)*2; if (i+byt >= srcLen) break; // extract the top bits of the nibble, if valid unsigned char curr = ((working[i+byt] << (8-ix)) & 0x3F); // extract the bottom bits of the nibble, if valid if (i+nib < srcLen) curr |= ((working[i+nib] >> ix) & 0x3F); [dest appendFormat:@"%c", base64[curr]]; } } return dest; } @end
如果需要,可以添加填充字符,使“byt”的范围更宽,并在返回之前用(2-byt)“=”字符附加“dest”。
然后可以将一个类别添加到NSString中,从而:
@implementation NSString (StringUtils) - (NSString *)newStringInBase64FromString { NSData *theData = [NSData dataWithBytes:[self UTF8String] length:[self length]]; return [theData newStringInBase64FromData]; } @end
自iOS 4以来,iOS内置了Base64编码和解码方法(不使用libresolv)。但是,它只在iOS 7 SDK中声明。 Apple文档指出,您可以在定位iOS 4及更高版本时使用它。
NSData *myData = ... some data NSString *base64String = [myData base64Encoding]; NSData *decodedData = [[NSData alloc] initWithBase64Encoding:base64String];
下面是一个将NSData对象转换为Base 64的例子。它还展示了如何去另一种方式(解码一个base 64编码的NSData对象):
NSData *dataTake2 = [@"iOS Developer Tips" dataUsingEncoding:NSUTF8StringEncoding]; // Convert to Base64 data NSData *base64Data = [dataTake2 base64EncodedDataWithOptions:0]; // Do something with the data... // Now convert back from Base64 NSData *nsdataDecoded = [base64Data initWithBase64EncodedData:base64Data options:0];
在iOS 7中
NSData *data=[[NSData alloc]init]; [data base64Encoding];
我已经完成了使用下面的类..
@implementation Base64Converter static char base64EncodingTable[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; + (NSString *) base64StringFromData: (NSData *)data length: (int)length { unsigned long ixtext, lentext; long ctremaining; unsigned char input[3], output[4]; short i, charsonline = 0, ctcopy; const unsigned char *raw; NSMutableString *result; lentext = [data length]; if (lentext < 1) return @""; result = [NSMutableString stringWithCapacity: lentext]; raw = [data bytes]; ixtext = 0; while (true) { ctremaining = lentext - ixtext; if (ctremaining <= 0) break; for (i = 0; i < 3; i++) { unsigned long ix = ixtext + i; if (ix < lentext) input[i] = raw[ix]; else input[i] = 0; } output[0] = (input[0] & 0xFC) >> 2; output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4); output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6); output[3] = input[2] & 0x3F; ctcopy = 4; switch (ctremaining) { case 1: ctcopy = 2; break; case 2: ctcopy = 3; break; } for (i = 0; i < ctcopy; i++) [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; for (i = ctcopy; i < 4; i++) [result appendString: @"="]; ixtext += 3; charsonline += 4; if ((length > 0) && (charsonline >= length)) charsonline = 0; } return result; } @end
呼叫时
[Base64Converter base64StringFromData:dataval length:lengthval];
而已…
我认为这将是有益的
+ (NSString *)toBase64String:(NSString *)string { NSData *data = [string dataUsingEncoding: NSUnicodeStringEncoding]; NSString *ret = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; return ret; } + (NSString *)fromBase64String:(NSString *)string { NSData *aData = [string dataUsingEncoding:NSUTF8StringEncoding]; NSData *aDataDecoded = [[NSData alloc]initWithBase64EncodedString:string options:0]; NSString *decryptedStr = [[NSString alloc]initWithData:aDataDecoded encoding:NSUTF8StringEncoding]; return [decryptedStr autorelease];
}
下载Base64
执行以下代码将图像转换为base64
NSString *base64String=[UIImagePNGRepresentation(image) base64Encoding];