封装成类的 。 base64格式的字符串,只包含大小写字母、零到九,以及 + /

//___base_64.h

/*base_64.h文件*/
#ifndef BASE_64_H
#define BASE_64_H
/**
* Base64 编码/解码
* @author liruixing
*/
class Base64{
private:
std::string _base64_table;
static const char base64_pad = '=';public:
Base64()
{
_base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /*这是Base64编码使用的标准字典*/
}
/**
* 这里必须是unsigned类型,否则编码中文的时候出错
*/
std::string Encode(const unsigned char * str,int bytes);
std::string Decode(const char *str,int bytes);
void Debug(bool open = true);
};
#endif
//___base_64.cpp
/*base_64.cpp文件*/
#include <iostream>
#include <string>
#include <cstring>
#include "base_64.h" std::string Base64::Encode(const unsigned char * str,int bytes) {
int num = ,bin = ,i;
std::string _encode_result;
const unsigned char * current;
current = str;
while(bytes > ) {
_encode_result += _base64_table[current[] >> ];
_encode_result += _base64_table[((current[] & 0x03) << ) + (current[] >> )];
_encode_result += _base64_table[((current[] & 0x0f) << ) + (current[] >> )];
_encode_result += _base64_table[current[] & 0x3f]; current += ;
bytes -= ;
}
if(bytes > )
{
_encode_result += _base64_table[current[] >> ];
if(bytes% == ) {
_encode_result += _base64_table[(current[] & 0x03) << ];
_encode_result += "==";
} else if(bytes% == ) {
_encode_result += _base64_table[((current[] & 0x03) << ) + (current[] >> )];
_encode_result += _base64_table[(current[] & 0x0f) << ];
_encode_result += "=";
}
}
return _encode_result;
}
std::string Base64::Decode(const char *str,int length) {
//解码表
const char DecodeTable[] =
{
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, , -, -, -, ,
, , , , , , , , , , -, -, -, -, -, -,
-, , , , , , , , , , , , , , , ,
, , , , , , , , , , , -, -, -, -, -,
-, , , , , , , , , , , , , , , ,
, , , , , , , , , , , -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -,
-, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -
};
int bin = ,i=,pos=;
std::string _decode_result;
const char *current = str;
char ch;
while( (ch = *current++) != '\0' && length-- > )
{
if (ch == base64_pad) { // 当前一个字符是“=”号
/*
先说明一个概念:在解码时,4个字符为一组进行一轮字符匹配。
两个条件:
1、如果某一轮匹配的第二个是“=”且第三个字符不是“=”,说明这个带解析字符串不合法,直接返回空
2、如果当前“=”不是第二个字符,且后面的字符只包含空白符,则说明这个这个条件合法,可以继续。
*/
if (*current != '=' && (i % ) == ) {
return NULL;
}
continue;
}
ch = DecodeTable[ch];
//这个很重要,用来过滤所有不合法的字符
if (ch < ) { /* a space or some other separator character, we simply skip over */
continue;
}
switch(i % )
{
case :
bin = ch << ;
break;
case :
bin |= ch >> ;
_decode_result += bin;
bin = ( ch & 0x0f ) << ;
break;
case :
bin |= ch >> ;
_decode_result += bin;
bin = ( ch & 0x03 ) << ;
break;
case :
bin |= ch;
_decode_result += bin;
break;
}
i++;
}
return _decode_result;
}

附1:C++实现 safaBase64格式跟nonSafeBase64格式的转换

附2:C++二进制字符串转十六进制字符串 十六进制字符串转二进制字符串

最新文章

  1. Sql Server 删除所有表(转)
  2. 虚拟机配置光盘为yum源
  3. 1-01Sql Sever 2008的安装
  4. JavaScript 中的原型声明和用法总结
  5. linux 修改系统时间
  6. 各设备如何清理dns缓存
  7. java正则表达式解析短信模板
  8. linux 下安装flash player
  9. js替换字符串的所有示例代码
  10. 攻略三战的完美体验3Castle Fantisia阿兰&#183;梅希亚战争艾伦西战记它包含重做版本(这是新的艾伦&#183;梅希亚大战)
  11. JS call与apply
  12. combo扩展:禁止手工改变输入框的值
  13. climit 头文件的内容
  14. 读取cc2530节点的设备类型、协调器、路由器、终端。
  15. (转)Java compiler level does not match解决方法
  16. 201521123079《java程序设计》第12周学习总结
  17. 正则和grep——再做正则就去死
  18. GC参考手册 —— GC 调优(命令篇)
  19. java json转换(二)
  20. Asp.net Web Api开发(第四篇)Help Page配置和扩展

热门文章

  1. mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例
  2. python里面出现中文的时候报错 &#39;ascii&#39; codec can&#39;t encode characters in position
  3. JSON序列化和反序列化的实例
  4. 44. log(n)求a的n次方[power(a,n)]
  5. Android ViewPager刷新解析
  6. Qt自定义事件的实现(军队真正干活,但要增加监军,大平台通知事件,事件内容自定义)
  7. ShopEx访问提示Incompatible file format: The encoded file has format major ID 2, whereas the Loader expects 4
  8. 阿里云1218动态css3代码
  9. JAVAEE——spring03:spring整合JDBC和aop事务
  10. eclipse快捷键 (包括查找类、方法、变量)
  11. listcontrolc插入列时,出现断言错误
  12. Freemarker进行非空处理
  13. python 变量名的规范
  14. SQL2008清空日志文件
  15. Flutter TabBar
  16. com.android.support:appcompat-v7 版本号问题
  17. android:onClick=&quot;xxx&quot;
  18. log4j2介绍及配置
  19. CF 547 D. Mike and Fish
  20. RocEDU.阅读.写作《霍乱时期的爱情》书摘(三)