当前位置:   article > 正文

base64编解码的两个函数

base64编解码的两个函数

base64编解码的两个函数,声明,参考网络上的代码实现。

  1. unsigned char *base64_encode(unsigned char *str, long* lpBufLen)
  2. {
  3. long len;
  4. long str_len;
  5. unsigned char *res;
  6. int i,j;
  7. //定义base64编码表
  8. const unsigned char *base64_table = (const unsigned char *)("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
  9. //计算经过base64编码后的字符串长度
  10. str_len=strlen((char*)str);
  11. if(str_len % 3 == 0)
  12. len=str_len/3*4;
  13. else
  14. len=(str_len/3+1)*4;
  15. if (NULL != lpBufLen) {
  16. *lpBufLen = len;
  17. }
  18. res = (unsigned char *)malloc(sizeof(unsigned char)*len+1);
  19. res[len]='\0';
  20. //以3个8位字符为一组进行编码
  21. for(i=0,j=0;i<len-2;j+=3,i+=4)
  22. {
  23. res[i]=base64_table[str[j]>>2]; //取出第一个字符的前6位并找出对应的结果字符
  24. res[i+1]=base64_table[(str[j]&0x3)<<4 | (str[j+1]>>4)]; //将第一个字符的后位与第二个字符的前4位进行组合并找到对应的结果字符
  25. res[i+2]=base64_table[(str[j+1]&0xf)<<2 | (str[j+2]>>6)]; //将第二个字符的后4位与第三个字符的前2位组合并找出对应的结果字符
  26. res[i+3]=base64_table[str[j+2]&0x3f]; //取出第三个字符的后6位并找出结果字符
  27. }
  28. switch(str_len % 3)
  29. {
  30. case 1:
  31. res[i-2]='=';
  32. res[i-1]='=';
  33. break;
  34. case 2:
  35. res[i-1]='=';
  36. break;
  37. }
  38. return res;
  39. }
  40. unsigned char *base64_decode(unsigned char *code, long* lpBufLen)
  41. {
  42. //根据base64表,以字符找到对应的十进制数据
  43. int table[]={0,0,0,0,0,0,0,0,0,0,0,0,
  44. 0,0,0,0,0,0,0,0,0,0,0,0,
  45. 0,0,0,0,0,0,0,0,0,0,0,0,
  46. 0,0,0,0,0,0,0,62,0,0,0,
  47. 63,52,53,54,55,56,57,58,
  48. 59,60,61,0,0,0,0,0,0,0,0,
  49. 1,2,3,4,5,6,7,8,9,10,11,12,
  50. 13,14,15,16,17,18,19,20,21,
  51. 22,23,24,25,0,0,0,0,0,0,26,
  52. 27,28,29,30,31,32,33,34,35,
  53. 36,37,38,39,40,41,42,43,44,
  54. 45,46,47,48,49,50,51
  55. };
  56. long len;
  57. long str_len;
  58. unsigned char *res;
  59. int i,j;
  60. //计算解码后的字符串长度
  61. len=strlen((char*)code);
  62. //判断编码后的字符串后是否有=
  63. if(strstr((char*)code,"=="))
  64. str_len=len/4*3-2;
  65. else if(strstr((char*)code,"="))
  66. str_len=len/4*3-1;
  67. else
  68. str_len=len/4*3;
  69. if (NULL != lpBufLen) {
  70. *lpBufLen = str_len;
  71. }
  72. res=(unsigned char*)malloc(sizeof(unsigned char)*str_len+1);
  73. res[str_len]='\0';
  74. //以4个字符为一位进行解码
  75. for(i=0,j=0;i < len-2;j+=3,i+=4)
  76. {
  77. res[j]=((unsigned char)table[code[i]])<<2 | (((unsigned char)table[code[i+1]])>>4); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的后2位进行组合
  78. res[j+1]=(((unsigned char)table[code[i+1]])<<4) | (((unsigned char)table[code[i+2]])>>2); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应bas464表的十进制数的后4位进行组合
  79. res[j+2]=(((unsigned char)table[code[i+2]])<<6) | ((unsigned char)table[code[i+3]]); //取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合
  80. }
  81. return res;
  82. }

  

转载于:https://www.cnblogs.com/eaglexmw/p/11062793.html

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

闽ICP备14008679号