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

  

base64编解码的两个函数的更多相关文章

  1. base64编解码的两个函数(安全版本)

    void base64_encode_s(const unsigned char *str, long inlen, std::string& outstr, long* lpBufLen) ...

  2. Delphi Base64 编解码函数

    Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...

  3. Delphi 自带的 Base64 编解码函数

    今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...

  4. ios Base64编解码工具类及使用

    为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...

  5. Delphi 自带了 Base64 编解码的单元

    Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因.  这个单元提供两套四个公开函数:  对流的编解码: procedu ...

  6. EasyDarwin开源流媒体云平台中boost Base64编解码后与源长度不匹配的bug

    本文转自EasyDarwin团队Alex的博客:http://blog.csdn.net/cai6811376 EasyDarwin云平台中部分协议使用了Base64编码昨晚报文通信的载体.比如在对摄 ...

  7. 【VBA研究】如何用Base64 编解码方法实现简单的加解密

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...

  8. C#字符串Base64编解码

    C#字符串Base64编解码 首先讲一下什么是Base64编码所谓Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,常用于在网络上传输不可见字符( ...

  9. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

随机推荐

  1. 前端开发HTML&css入门——伪类选择器和一些特殊的选择器

    伪类和伪元素 有时候,你需要选择本身没有标签,但是仍然易于识别的网页部位,比如段落首行或鼠标滑过的连接.CSS为他们提供一些选择器:伪类和伪元素. 常用的一些伪类选择器: :link :visited ...

  2. Django中使用djangorestframework产生Token

    修改settings.py: INSTALLED_APPS添加rest_framework 产生Token from rest_framework.authtoken.models import To ...

  3. 感想 - 猴子刷视频app

    看到一个视频,内容是一只猿猴熟练地像人一样刷短视频app,惟妙惟肖:https://pan.baidu.com/s/10-eibLmuybKtRJ-CKnruYA 抽象思考和语言才是人类独有的能力,视 ...

  4. web框架-(三)Django进阶

    通过上节课的学习,我们已经对Django有了简单的了解,现在来深入了解下~ 1. 路由系统 1.1 单一路由对应 url(r'^index$', views.index), 1.2 基于正则的路由 u ...

  5. socket keepalive 服务端异常断线

    异常断线  客户端检测不到  没有重连

  6. JVM 程序计数器

    程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转 ...

  7. APIO2019 题解

    APIO2019 题解 T1 奇怪装置 题目传送门 https://loj.ac/problem/3144 题解 很容易发现,这个东西一定会形成一个环.我们只需要求出环的长度就解决了一切问题. 设环的 ...

  8. Java内存模型(JMM)的可见性

    JMM(Java Memory Model)内存模型之可见性 JMM是Java内存模型的缩写,本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字 ...

  9. 简单后台登录逻辑实现Controller

    package com.fei.controller.admin; import javax.servlet.http.HttpSession; import org.springframework. ...

  10. Java 8 Date常用工具类

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11983108.html Demo package org.fool.util; import java ...