Base64是常用的编码规范之一,如网络传输中应用广泛,之前列举过base64编码的原理:《base64举例》 以及java实现的base64编码工具类。
这里,贴出OC下的base64代码,在平台之间通信过程中保证编码能通用——中间出现一个编码问题,google官方提供的base64Util包默认用的Utf-8编码,而中文之前统一用的gbk编码,以下代码修正了这个问题:
关键点:将CommonFunc的
base64StringFromText 和 textFromBase64String中的UTF8encoding改成gbkEncoding:
NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
改成
NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData *data = [text dataUsingEncoding:gbkEncoding];
// // CommonFunc.h // Base64Proj // // Created by qslang on 14-6-12. // Copyright (c) 2014年 Dev. All rights reserved. #import <Foundation/Foundation.h> #define __BASE64( text ) [CommonFunc base64StringFromText:text] #define __TEXT( base64 ) [CommonFunc textFromBase64String:base64] @interface CommonFunc : NSObject /****************************************************************************** 函数名称 : + (NSString *)base64StringFromText:(NSString *)text 函数描述 : 将文本转换为base64格式字符串 输入参数 : (NSString *)text 文本 输出参数 : N/A 返回参数 : (NSString *) base64格式字符串 备注信息 : ******************************************************************************/ + (NSString *)base64StringFromText:(NSString *)text; /****************************************************************************** 函数名称 : + (NSString *)textFromBase64String:(NSString *)base64 函数描述 : 将base64格式字符串转换为文本 输入参数 : (NSString *)base64 base64格式字符串 输出参数 : N/A 返回参数 : (NSString *) 文本 备注信息 : ******************************************************************************/ + (NSString *)textFromBase64String:(NSString *)base64; @end
1 // 2 // CommonFunc.m 3 // Base64Proj 4 // 5 // Created by qslang on 14-6-12. 6 // Copyright (c) 2014年 Dev. All rights reserved. 7 // 8 9 #import "CommonFunc.h" 10 11 //引入IOS自带密码库 12 #import <CommonCrypto/CommonCryptor.h> 13 14 //空字符串 15 #define LocalStr_None @"" 16 17 static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 18 19 @implementation CommonFunc 20 21 + (NSString *)base64StringFromText:(NSString *)text 22 { 23 if (text && ![text isEqualToString:LocalStr_None]) { 24 NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 25 26 //取项目的bundleIdentifier作为KEY 改动了此处 27 //NSString *key = [[NSBundle mainBundle] bundleIdentifier]; 28 NSData *data = [text dataUsingEncoding:gbkEncoding];//NSUTF8StringEncoding 29 //IOS 自带DES加密 Begin 改动了此处 30 //data = [self DESEncrypt:data WithKey:key]; 31 //IOS 自带DES加密 End 32 return [self base64EncodedStringFrom:data]; 33 } 34 else { 35 return LocalStr_None; 36 } 37 } 38 39 + (NSString *)textFromBase64String:(NSString *)base64 40 { 41 if (base64 && ![base64 isEqualToString:LocalStr_None]) { 42 //取项目的bundleIdentifier作为KEY 改动了此处 43 //NSString *key = [[NSBundle mainBundle] bundleIdentifier]; 44 NSData *data = [self dataWithBase64EncodedString:base64]; 45 //IOS 自带DES解密 Begin 改动了此处 46 //data = [self DESDecrypt:data WithKey:key]; 47 //IOS 自带DES加密 End 48 NSStringEncoding gbkEncoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 49 50 return [[NSString alloc] initWithData:data encoding:gbkEncoding]; 51 } 52 else { 53 return LocalStr_None; 54 } 55 } 56 57 /****************************************************************************** 58 函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 59 函数描述 : 文本数据进行DES加密 60 输入参数 : (NSData *)data 61 (NSString *)key 62 输出参数 : N/A 63 返回参数 : (NSData *) 64 备注信息 : 此函数不可用于过长文本 65 ******************************************************************************/ 66 + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 67 { 68 char keyPtr[kCCKeySizeAES256+1]; 69 bzero(keyPtr, sizeof(keyPtr)); 70 71 [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 72 73 NSUInteger dataLength = [data length]; 74 75 size_t bufferSize = dataLength + kCCBlockSizeAES128; 76 void *buffer = malloc(bufferSize); 77 78 size_t numBytesEncrypted = 0; 79 CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, 80 kCCOptionPKCS7Padding | kCCOptionECBMode, 81 keyPtr, kCCBlockSizeDES, 82 NULL, 83 [data bytes], dataLength, 84 buffer, bufferSize, 85 &numBytesEncrypted); 86 if (cryptStatus == kCCSuccess) { 87 return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 88 } 89 90 free(buffer); 91 return nil; 92 } 93 94 /****************************************************************************** 95 函数名称 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 96 函数描述 : 文本数据进行DES解密 97 输入参数 : (NSData *)data 98 (NSString *)key 99 输出参数 : N/A 100 返回参数 : (NSData *) 101 备注信息 : 此函数不可用于过长文本 102 ******************************************************************************/ 103 + (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key 104 { 105 char keyPtr[kCCKeySizeAES256+1]; 106 bzero(keyPtr, sizeof(keyPtr)); 107 108 [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 109 110 NSUInteger dataLength = [data length]; 111 112 size_t bufferSize = dataLength + kCCBlockSizeAES128; 113 void *buffer = malloc(bufferSize); 114 115 size_t numBytesDecrypted = 0; 116 CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES, 117 kCCOptionPKCS7Padding | kCCOptionECBMode, 118 keyPtr, kCCBlockSizeDES, 119 NULL, 120 [data bytes], dataLength, 121 buffer, bufferSize, 122 &numBytesDecrypted); 123 124 if (cryptStatus == kCCSuccess) { 125 return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 126 } 127 128 free(buffer); 129 return nil; 130 } 131 132 133 /****************************************************************************** 134 函数名称 : + (NSData *)dataWithBase64EncodedString:(NSString *)string 135 函数描述 : base64格式字符串转换为文本数据 136 输入参数 : (NSString *)string 137 输出参数 : N/A 138 返回参数 : (NSData *) 139 备注信息 : 140 ******************************************************************************/ 141 + (NSData *)dataWithBase64EncodedString:(NSString *)string 142 { 143 if (string == nil) 144 [NSException raise:NSInvalidArgumentException format:nil]; 145 if ([string length] == 0) 146 return [NSData data]; 147 148 static char *decodingTable = NULL; 149 if (decodingTable == NULL) 150 { 151 decodingTable = malloc(256); 152 if (decodingTable == NULL) 153 return nil; 154 memset(decodingTable, CHAR_MAX, 256); 155 NSUInteger i; 156 for (i = 0; i < 64; i++) 157 decodingTable[(short)encodingTable[i]] = i; 158 } 159 160 const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding]; 161 if (characters == NULL) // Not an ASCII string! 162 return nil; 163 char *bytes = malloc((([string length] + 3) / 4) * 3); 164 if (bytes == NULL) 165 return nil; 166 NSUInteger length = 0; 167 168 NSUInteger i = 0; 169 while (YES) 170 { 171 char buffer[4]; 172 short bufferLength; 173 for (bufferLength = 0; bufferLength < 4; i++) 174 { 175 if (characters[i] == '