1.在Android中java层提供了工具类:android.util.Base64;

里面都是静态方法,方便直接使用:

使用方法如下:

Java代码
  1. //Base64编码:
  2. byte[]encode=Base64.encode("Hello,World".getBytes(),Base64.DEFAULT);
  3. Stringenc=newString(encode);
  4. Log.d("","base64encode="+enc);
  5. //Base64解码:
  6. byte[]result=Base64.decode("SGVsbG8sIFdvcmxk",Base64.DEFAULT);
  7. Stringres=newString(result);
  8. Log.d("","base64result="+res);

例子演示了将"Hello, World"编码成"SGVsbG8sIFdvcmxk",然后又解码回来。简单易懂。

2.对于ios来说,有google的提供的一个工具箱来解决。

网址:http://code.google.com/p/google-toolbox-for-mac/

需要从里面找出3个文件:GTMBase64.h,GTMBase64.m,GTMDefines.h

将这三个文件加入ios工程中即可使用了。

例如:

使用:

NSLog(@"%@", [selfencodeBase64:@"Hello, World"]);

NSLog(@"%@", [selfdecodeBase64:@"SGVsbG8sIFdvcmxk"]);

调用的自己封装的函数:

- (NSString*) encodeBase64:(NSString*) input{

NSData*data = [inputdataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];

data = [GTMBase64encodeData:data];

NSString*base64String = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];

returnbase64String;

}

- (NSString*) decodeBase64:(NSString*) input{

NSData*data = [inputdataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];

data = [GTMBase64decodeData:data];

NSString*string = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];

returnstring;

}

3.在Android中,我们也可以将base64的编解码算法放到jni中,这样也是比较方便的。

对应的c中算法如下:

C代码
  1. #include"com_example_base64test_JniTest.h"
  2. #include<stdlib.h>
  3. #include<android/log.h>//这个是输出LOG所用到的函数所在的路径
  4. #defineLOG_TAG"JNILOG"//这个是自定义的LOG的标识
  5. #undefLOG//取消默认的LOG
  6. #defineLOGD(...)__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)//定义LOG类型
  7. #defineLOGI(...)__android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)//定义LOG类型
  8. #defineLOGW(...)__android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)//定义LOG类型
  9. #defineLOGE(...)__android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)//定义LOG类型
  10. #defineLOGF(...)__android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__)//定义LOG类型
  11. constcharbase[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  12. char*base64_encode(constchar*data,intdata_len);
  13. char*base64_decode(constchar*data,intdata_len);
  14. staticcharfind_pos(charch);
  15. /*
  16. *Class:com_example_base64test_JniTest
  17. *Method:encode
  18. *Signature:(Ljava/lang/String;)Ljava/lang/String;
  19. */
  20. JNIEXPORTjstringJNICALLJava_com_example_base64test_JniTest_encode
  21. (JNIEnv*env,jobjectobj,jstringstring)
  22. {
  23. //先将jstring转换成char*
  24. char*t=0;
  25. jclassclsstring=env->FindClass("java/lang/String");
  26. jstringstrencode=env->NewStringUTF("utf-8");
  27. jmethodIDmid=env->GetMethodID(clsstring,"getBytes","(Ljava/lang/String;)[B");
  28. jbyteArraybarr=(jbyteArray)env->CallObjectMethod(string,mid,strencode);
  29. jsizealen=env->GetArrayLength(barr);
  30. jbyte*ba=env->GetByteArrayElements(barr,JNI_FALSE);
  31. if(alen>0)
  32. {
  33. t=(char*)malloc(alen+1);
  34. memcpy(t,ba,alen);
  35. t[alen]=0;
  36. }
  37. env->ReleaseByteArrayElements(barr,ba,0);
  38. //此时的t里面有了jstring的内容
  39. inti=0;
  40. intj=strlen(t);
  41. char*enc=base64_encode(t,j);
  42. intlen=strlen(enc);
  43. char*dec=base64_decode(enc,len);
  44. LOGD("\noriginal:%s\n",t);
  45. LOGD("\nencoded:%s\n",enc);
  46. LOGD("\ndecoded:%s\n",dec);
  47. free(enc);
  48. free(dec);
  49. //将base64编码后的char转换成jstring返回给java层
  50. //jclassstrClass=env->FindClass("Ljava/lang/String;");
  51. jclassstrClass=env->FindClass("java/lang/String");
  52. jmethodIDctorID=env->GetMethodID(strClass,"<init>","([BLjava/lang/String;)V");
  53. jbyteArraybytes=env->NewByteArray(strlen(enc));
  54. env->SetByteArrayRegion(bytes,0,strlen(enc),(jbyte*)enc);
  55. jstringencoding=env->NewStringUTF("UTF-8");
  56. //jcharencoding_name[]={'U','T','F','-','8'};
  57. //jstringencoding=env->NewString(encoding_name,5);
  58. return(jstring)env->NewObject(strClass,ctorID,bytes,encoding);
  59. //jbytebuffer[]=/*UTF8encodingbuffer*/
  60. //
  61. //jbyteArraybytes=env->NewByteArray(sizeof(buffer));
  62. //
  63. //env->SetByteArrayRegion(bytes,0,sizeof(buffer),buffer);
  64. //returnbytes;
  65. }
  66. /*
  67. *Class:com_example_base64test_JniTest
  68. *Method:decode
  69. *Signature:(Ljava/lang/String;)Ljava/lang/String;
  70. */
  71. JNIEXPORTjstringJNICALLJava_com_example_base64test_JniTest_decode
  72. (JNIEnv*env,jobjectobj,jstringbase)
  73. {
  74. //先将jstring转换成char*
  75. char*t=0;
  76. jclassclsstring=env->FindClass("java/lang/String");
  77. jstringstrencode=env->NewStringUTF("utf-8");
  78. jmethodIDmid=env->GetMethodID(clsstring,"getBytes","(Ljava/lang/String;)[B");
  79. jbyteArraybarr=(jbyteArray)env->CallObjectMethod(base,mid,strencode);
  80. jsizealen=env->GetArrayLength(barr);
  81. jbyte*ba=env->GetByteArrayElements(barr,JNI_FALSE);
  82. if(alen>0)
  83. {
  84. t=(char*)malloc(alen+1);
  85. memcpy(t,ba,alen);
  86. t[alen]=0;
  87. }
  88. env->ReleaseByteArrayElements(barr,ba,0);
  89. //此时的t里面有了jstring的内容
  90. inti=0;
  91. intj=strlen(t);
  92. //char*enc=base64_encode(t,j);
  93. //intlen=strlen(enc);
  94. char*dec=base64_decode(t,j);
  95. LOGD("\noriginal:%s\n",t);
  96. //LOGD("\nencoded:%s\n",enc);
  97. LOGD("\ndecoded:%s\n",dec);
  98. //free(enc);
  99. free(dec);
  100. //将base64编码后的char转换成jstring返回给java层
  101. //jclassstrClass=env->FindClass("Ljava/lang/String;");
  102. jclassstrClass=env->FindClass("java/lang/String");
  103. jmethodIDctorID=env->GetMethodID(strClass,"<init>","([BLjava/lang/String;)V");
  104. jbyteArraybytes=env->NewByteArray(strlen(dec));
  105. env->SetByteArrayRegion(bytes,0,strlen(dec),(jbyte*)dec);
  106. jstringencoding=env->NewStringUTF("utf-8");
  107. jobjectresult=env->NewObject(strClass,ctorID,bytes,encoding);
  108. return(jstring)env->NewObject(strClass,ctorID,bytes,encoding);
  109. //returnresult;
  110. //returnbytes;
  111. }
  112. /**/
  113. char*base64_encode(constchar*data,intdata_len)
  114. {
  115. //intdata_len=strlen(data);
  116. intprepare=0;
  117. intret_len;
  118. inttemp=0;
  119. char*ret=NULL;
  120. char*f=NULL;
  121. inttmp=0;
  122. charchanged[4];
  123. inti=0;
  124. ret_len=data_len/3;
  125. temp=data_len%3;
  126. if(temp>0)
  127. {
  128. ret_len+=1;
  129. }
  130. ret_len=ret_len*4+1;
  131. ret=(char*)malloc(ret_len);
  132. if(ret==NULL)
  133. {
  134. LOGD("Noenoughmemory.\n");
  135. exit(0);
  136. }
  137. memset(ret,0,ret_len);
  138. f=ret;
  139. while(tmp<data_len)
  140. {
  141. temp=0;
  142. prepare=0;
  143. memset(changed,'\0',4);
  144. while(temp<3)
  145. {
  146. //printf("tmp=%d\n",tmp);
  147. if(tmp>=data_len)
  148. {
  149. break;
  150. }
  151. prepare=((prepare<<8)|(data[tmp]&0xFF));
  152. tmp++;
  153. temp++;
  154. }
  155. prepare=(prepare<<((3-temp)*8));
  156. //printf("beforefor:temp=%d,prepare=%d\n",temp,prepare);
  157. for(i=0;i<4;i++)
  158. {
  159. if(temp<i)
  160. {
  161. changed[i]=0x40;
  162. }
  163. else
  164. {
  165. changed[i]=(prepare>>((3-i)*6))&0x3F;
  166. }
  167. *f=base[changed[i]];
  168. //printf("%.2X",changed[i]);
  169. f++;
  170. }
  171. }
  172. *f='\0';
  173. returnret;
  174. }
  175. /**/
  176. staticcharfind_pos(charch)
  177. {
  178. char*ptr=(char*)strrchr(base,ch);//thelastposition(theonly)inbase[]
  179. return(ptr-base);
  180. }
  181. /**/
  182. char*base64_decode(constchar*data,intdata_len)
  183. {
  184. intret_len=(data_len/4)*3;
  185. intequal_count=0;
  186. char*ret=NULL;
  187. char*f=NULL;
  188. inttmp=0;
  189. inttemp=0;
  190. charneed[3];
  191. intprepare=0;
  192. inti=0;
  193. if(*(data+data_len-1)=='=')
  194. {
  195. equal_count+=1;
  196. }
  197. if(*(data+data_len-2)=='=')
  198. {
  199. equal_count+=1;
  200. }
  201. if(*(data+data_len-3)=='=')
  202. {//seemsimpossible
  203. equal_count+=1;
  204. }
  205. switch(equal_count)
  206. {
  207. case0:
  208. ret_len+=4;//3+1[1forNULL]
  209. break;
  210. case1:
  211. ret_len+=4;//Ceil((6*3)/8)+1
  212. break;
  213. case2:
  214. ret_len+=3;//Ceil((6*2)/8)+1
  215. break;
  216. case3:
  217. ret_len+=2;//Ceil((6*1)/8)+1
  218. break;
  219. }
  220. ret=(char*)malloc(ret_len);
  221. if(ret==NULL)
  222. {
  223. LOGD("Noenoughmemory.\n");
  224. exit(0);
  225. }
  226. memset(ret,0,ret_len);
  227. f=ret;
  228. while(tmp<(data_len-equal_count))
  229. {
  230. temp=0;
  231. prepare=0;
  232. memset(need,0,4);
  233. while(temp<4)
  234. {
  235. if(tmp>=(data_len-equal_count))
  236. {
  237. break;
  238. }
  239. prepare=(prepare<<6)|(find_pos(data[tmp]));
  240. temp++;
  241. tmp++;
  242. }
  243. prepare=prepare<<((4-temp)*6);
  244. for(i=0;i<3;i++)
  245. {
  246. if(i==temp)
  247. {
  248. break;
  249. }
  250. *f=(char)((prepare>>((2-i)*8))&0xFF);
  251. f++;
  252. }
  253. }
  254. *f='\0';
  255. returnret;
  256. }

不过这个例子里面,log打印的都是正确的,可是返回到java层的确是乱码,这个问题暂时还没有解决。希望有明白的同志告知一下。谢谢。工程附件中。

更多相关文章

  1. android 通信机制 socket
  2. Android(安卓)ServiceManager注册自定义service
  3. Android(安卓)最火框架XUtils之注解机制详解
  4. android studio里面的svn基本使用
  5. Base64编解码Android和ios的例子,补充JNI中的例子
  6. Android(安卓)自定义标签 和 自定义组件
  7. android Gallery实现加载网络图片
  8. Android(安卓)自定义像素AVD模拟器无键盘
  9. 2011.08.18(2)——— android 自定义组合组件 onFinishInflate onS

随机推荐

  1. 数据库悲观锁 for update 的使用场景之一
  2. 你真的懂 select count(*) 吗?
  3. Centos7环境部署及基本操作
  4. 任务介绍及比赛结果 在刚刚结束的CoNLL-2
  5. “双亲委派”一词的由来
  6. 尚硅谷大数据视频_Hive视频教程免费下载
  7. MySQL InnoDB存储引擎select和update查询
  8. 令人振奋!哈工大SCIR在国际多语言通用依存
  9. 尚硅谷大数据视频_Hadoop视频教程免费下
  10. 《尚硅谷React视频教程》免费下载