当前位置:   article > 正文

c语言实现base64_c语言 base64

c语言 base64

Base64字符包括 A-Z a-z 0-9 + / 共计64个字符,对应0-63

将原始字符串按6bit拆分,前面补两个0组成一个新的字节

最后一位不满8位补0  ,在末尾用=标记补了几个0,补两个0加一个= ,补四个0加俩=

C语言实现如下:

  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "stdlib.h"
  4. char* base64_decode(const char* str){
  5. unsigned char imap[79]={62,0,0,0,63,52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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};
  6. int rest_count =0;
  7. int buf_idx=0;
  8. int len = strlen(str);
  9. int flen = len;
  10. while(str[flen-1]=='=')
  11. flen--;
  12. int buflen = flen*6/8+1;
  13. unsigned char* buf = (unsigned char*) malloc(buflen);
  14. memset(buf,'\0',buflen);
  15. for(int i=0;i<flen;i++){
  16. unsigned char c=imap[str[i]-43];
  17. int mcount = rest_count ==0?-2:6-rest_count;
  18. unsigned char c0 = (mcount>0?c>>mcount:c<<-mcount);
  19. buf[buf_idx] = buf[buf_idx] | c0;
  20. rest_count= mcount <0 ? -mcount : 8-mcount;
  21. if(mcount>=0)
  22. buf[++buf_idx]=c<<rest_count;
  23. }
  24. return buf;
  25. }
  26. char* base64_encode(const char* str){
  27. char map[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  28. int len =strlen(str);
  29. int buflen = len * 8 / 6 + 4;//缺位补齐1 俩等号2 最后0-1位
  30. unsigned char* buf = (unsigned char*)malloc(buflen);
  31. memset(buf,'\0',buflen);
  32. char a [4];
  33. int rest_count = 0;
  34. int index = 0;
  35. int buf_idx =0 ;
  36. unsigned char last = 0;
  37. for(int i=0;i<len;i++){
  38. unsigned char c = str[i];
  39. a[index]= (last<<(6-rest_count))&63;
  40. int get_count = 6-rest_count;
  41. a[index] = a[index] | ( c >>(8-get_count));
  42. a[index]=map[a[index]];
  43. rest_count = 8-get_count;
  44. last = c;
  45. index = index==2?0:index+1;
  46. if(index==0){
  47. a[3]=map[c&63];
  48. memcpy(buf+buf_idx,a,4);
  49. buf_idx+=4;
  50. rest_count=0;
  51. last = 0;
  52. }
  53. }
  54. if(index!=0){
  55. a[index]= last<<(6-rest_count) & 63;
  56. a[index]=map[a[index]];
  57. memcpy(buf+buf_idx,a,index+1);
  58. buf[buf_idx+index+1]='=';
  59. buf[buf_idx+index+2]= rest_count ==2 ? '=':0;
  60. }
  61. return buf;
  62. }
  63. int main()
  64. {
  65. char* c = base64_encode("abcdefgh");
  66. printf("decode:%s\n",c);
  67. char* d = base64_decode(c);
  68. printf("encode:%s\n",d);
  69. free(c);
  70. free(d);
  71. }

输出结果如下:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/863844
推荐阅读
相关标签
  

闽ICP备14008679号