编码:

/*
*inHex:输入参数,待编码十六进制数据首地址,如果NULL表示计算输出需要缓冲大小
*inBytes:输入参数,待编码十六进制数据字节长度,如果<=0表示计算输出需要缓冲大小
*outStr:输出参数,编码之后的字符串数据
*outBufLen:输入参数,编码出来的缓存字节
*返回值:>=0表示成功编码,编码后数据长度;<0表示出错
*/
int Base64Encode(char* inHex, int inBytes, char* outStr, int outBufLen)
{/*  A-Z a-z 0-9 +/  */int i = 0;int charIndex = 0;switch (inBytes % 3) {case 0:i = (i / 3) * 4;break;case 1:i = (i / 3) * 4 + 1 + 1;i = i + 2;break;case 2:i = (i / 3) * 4 + 1 + 1 + 1;i = i + 1;break;}if (outStr == NULL || outBufLen <= 0) {i++;goto EXIT_FUN;}if (i >= outBufLen) {/* 缓冲不够 */i = -1;goto EXIT_FUN;}charIndex = 0;for (i = 0; i < inBytes; i++) {switch (i % 3) {case 0:charIndex = inHex[i] >> 2;        break;case 1:charIndex = inHex[i - 1] << 4;  charIndex &= 0x00000030;charIndex |= (inHex[i] >> 4) & 0x0F;break;case 2:charIndex = inHex[i - 1] << 2;  charIndex &= 0x0000003C;charIndex |= (inHex[i] >> 6) & 0x03;break;default:break;}charIndex &= 0x0000003F;if (charIndex >= 0 && charIndex < 26) {outStr[(i / 3) * 4 + (i % 3)] = 'A' + charIndex;} else if (charIndex >= 26 && charIndex < 52) {outStr[(i / 3) * 4 + (i % 3)] = 'a' + charIndex - 26;} else if (charIndex >= 52 && charIndex < 62) {outStr[(i / 3) * 4 + (i % 3)] = '0' + charIndex - 52;} else if (charIndex == 62) {outStr[(i / 3) * 4 + (i % 3)] = '+';} else if (charIndex == 63) {outStr[(i / 3) * 4 + (i % 3)] = '/';}if ((i % 3) == 2 || i + 1 >= inBytes) {if ((i % 3) == 2) {charIndex = inHex[i];charIndex &= 0x0000003F;} else if ((i % 3) == 0) {charIndex = inHex[i] << 4;    charIndex &= 0x00000030;} else if ((i % 3) == 1) {charIndex = inHex[i] << 2;  charIndex &= 0x0000003C;}if (charIndex >= 0 && charIndex < 26) {outStr[(i / 3) * 4 + (i % 3) + 1] = 'A' + charIndex;} else if (charIndex >= 26 && charIndex < 52) {outStr[(i / 3) * 4 + (i % 3) + 1] = 'a' + charIndex - 26;} else if (charIndex >= 52 && charIndex < 62) {outStr[(i / 3) * 4 + (i % 3) + 1] = '0' + charIndex - 52;} else if (charIndex == 62) {outStr[(i / 3) * 4 + (i % 3) + 1] = '+';} else if (charIndex == 63) {outStr[(i / 3) * 4 + (i % 3) + 1] = '/';}}}switch (inBytes % 3) {case 0:i = (i / 3) * 4;break;case 1:i = (i / 3) * 4 + 1 + 1;strcpy(outStr + i, "==");i = i + 2;break;case 2:i = (i / 3) * 4 + 1 + 1 + 1;strcpy(outStr + i, "=");i = i + 1;break;}outStr[i] = 0;EXIT_FUN:return i;
}

解码:

/*
*inStr:输入参数,待解码字符串数据首地址,如果NULL表示计算输出需要缓冲大小
*outHex:输出参数,解码之后的十六进制数据
*outBufLen:输入参数,解码出来的缓存字节
*返回值:>=0表示成功编码,编码后数据长度;<0表示出错
*/
int Base64Decode(char* inStr, char* outHex, int outBufLen)
{int i = 0;int equalSignCnt = 0;int inLen = strlen(inStr);int charIndex = 0;int validBase64Index = 0;char tmp[4];for (i = 0; i < inLen; i++) {if (inStr[i] >= 'A' && inStr[i] <= 'Z') {charIndex = inStr[i] - 'A';} else if (inStr[i] >= 'a' && inStr[i] <= 'z') {charIndex = inStr[i] - 'a' + 26;} else if (inStr[i] >= '0' && inStr[i] <= '9') {charIndex = inStr[i] - '0' + 52;} else if (inStr[i] == '+') {charIndex = 62;} else if (inStr[i] == '/') {charIndex = 63;} else if (inStr[i] == '=') {for (equalSignCnt = 0; i < inLen; i++) {if (inStr[i] == '=') {equalSignCnt++;}}   if (equalSignCnt > 2 || equalSignCnt < 1) {/* 数据格式错误 */i = -1;goto EXIT_FUN;}break;} else {continue;}if (outHex == NULL || outBufLen <= 0) {validBase64Index++;continue;}switch (validBase64Index % 4) {case 0:tmp[0] = charIndex << 2;tmp[0] &= (~0x03);break;case 1:tmp[0] |= (charIndex >> 4);tmp[1] = (charIndex << 4);tmp[1] &= 0xF0;break;case 2:tmp[1] |= (charIndex >> 2);tmp[2] = charIndex << 6;tmp[2] &= 0xC0;break;case 3:tmp[2] |= charIndex;        if ((validBase64Index / 4) * 3 + 3 >= outBufLen) {/* 缓冲不够 */i = -1;goto EXIT_FUN;}outHex[(validBase64Index / 4) * 3] = tmp[0];outHex[(validBase64Index / 4) * 3 + 1] = tmp[1];outHex[(validBase64Index / 4) * 3 + 2] = tmp[2];break;}validBase64Index++;}if ((validBase64Index % 4) == 0) {if (i >= inLen) {i = (validBase64Index / 4) * 3;goto EXIT_FUN;}/* 数据格式错误 */i = -1;goto EXIT_FUN;}/* if (inStr[i] == '=') */if (equalSignCnt == 1) {if (outHex != NULL && outBufLen > 0) {if ((validBase64Index / 4) * 3 + 2 >= outBufLen) {/* 缓冲不够 */i = -1;goto EXIT_FUN;}outHex[(validBase64Index / 4) * 3] = tmp[0];outHex[(validBase64Index / 4) * 3 + 1] = tmp[1];}i = (validBase64Index / 4) * 3 + 2;}if (equalSignCnt == 2) {if (outHex != NULL && outBufLen > 0) {if ((validBase64Index / 4) * 3 + 1 >= outBufLen) {/* 缓冲不够 */i = -1;goto EXIT_FUN;}outHex[(validBase64Index / 4) * 3] = tmp[0];}i = (validBase64Index / 4) * 3 + 1; }EXIT_FUN:return i;
}

Base64编码解码C代码实现相关推荐

  1. java svgbase64转byte_java 图片进行base64 编码解码

    java 图片进行base64 编码解码 刘振兴 代码分享 2017年06月07日 10555 2条评论 import sun.misc.BASE64Decoder; import sun.misc. ...

  2. Java工程中引用Base64编码解码小记

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一. Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两 ...

  3. Javascript中Base64编码解码的使用实例

    Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...

  4. 原来浏览器原生支持JS Base64编码解码

    原来浏览器原生支持JS Base64编码解码 转载来源:https://www.zhangxinxu.com/wordpress/2018/08/js-base64-atob-btoa-encode- ...

  5. base64编码解码讲解

    一.base64 base64是一种对字符通过二进制进行编码解码转换的一种编码算法,便于在不同环境间通信,规避了乱码的出现. base64算法: 1->字符串转换为三个字节一组,不足三个字节时用 ...

  6. Base64 编码原理及代码实现

    Base64 编码原理及代码实现 所谓 base64 编码就是从 ASCII 码表中选取64个可打印字符(A-Za-z0-9+/)作为基本字符集对其它字符进行编码转换.加上作为填充的 "=& ...

  7. Base64编码/解码原理及实现

    前两天在做一个项目时,合作方的开发人员说需要用到Base64 编码.由于之前没听说过这种编码,马上上网google 了下资料,才发现Base64 编码使用得这么普遍,最常用的就是电子邮件传输编码方式. ...

  8. Python 图片数据MYSQL存取(BASE64编码解码)

    Python 图片数据MYSQL存取(BASE64编码解码) 1.相关python代码 #-*- coding:utf-8 -*-import pymysql import sys import ba ...

  9. js base64 编码解码

    js base64 编码解码 encode decode,可以直接使用 function Base64() {// private property_keyStr = "ABCDEFGHIJ ...

最新文章

  1. 实战并发编程 - 03基于不可变模式解决并发问题_1
  2. Andriod --- JetPack (六):Room 增删改查
  3. Python 判断字符串是否包含中文
  4. 我是如何打败拖延症的
  5. springboot拦截请求路径_SpringBoot整合Ant Design Pro进行部署
  6. jwt java 项目实例_JWT(JsonWebToken)+SpringMVC项目demo
  7. 微信小程序之设置背景图片
  8. shell 小米system锁adb_小米解锁Bootloder和system分区,获取完整root
  9. Java基础面试题(2022最新版汇总)
  10. golang dep 导入报错问题
  11. 计算机出现假桌面怎么解决办法,win10专业版系统桌面经常假死解决办法
  12. 程序员VS产品经理的世纪之争
  13. 四柱笔记(一):基本阴阳理论
  14. python文本可读性
  15. Linux网络编程-七
  16. Xcode 13.4.1如何显示文件拓展名
  17. Beego搭建企业微信机器人定时消息推送
  18. 互联网快讯:粉笔科技双核驱动实现突围;猿辅导以科技助力教育提质增效;抖音升级谣言专项治理
  19. Google Capture The Flag 2019 (Quals) WP
  20. 军工科研质量管理软件全面支持GJB5000A

热门文章

  1. 国产最强开源 API 网关
  2. java中的值传递和引用传递2原文:http://blog.csdn.net/niuniu20008/article/details/2953785...
  3. 蓝桥杯:第九届—“彩灯控制器”
  4. Google Instant Apps
  5. 如何更改mysql数据库的用户名和密码
  6. 互联网时代各行业都在快速更替,金融行业为什么即将成为下一个风口?
  7. 异步爬虫(高效爬虫)
  8. innerText和innerHTML区别
  9. 【BIOS】MBR引导程序类型及详解
  10. 各版本sqlserver下载地址