当前位置: 首页 > news >正文

base64编码简介

什么是base64编码?

  • Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于 2^6=64 ,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
  •  
  • base64index
  • base64man
  • 如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。也就是说,当最后剩余两个八位字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;如果最后剩余一个八位字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表: 
Base64编码与解码的C++实现#include <iostream>
#include <string>
#include <unistd.h>using namespace std;class Base64
{
public:int Encode(string &s);int Decode(string &s);int EncodeWeb(string &s);int DecodeWeb(string &s);
private:const unsigned char Base64EncodeMap[64] ={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','I', 'J', 'K', 'L', 'M', 'N', 'O', 'P','Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X','Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f','g', 'h', 'i', 'j', 'k', 'l', 'm', 'n','o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', '0', '1', '2', '3','4', '5', '6', '7', '8', '9', '+', '/'};const unsigned char Base64DecodeMap[256] ={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F,0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};string EncodeEach(char s[3]);string s_processed;int DecodeCheck(const string &s, bool isWebSafe);
};
int Base64::Encode(string &s)
{char str_to_operate[3] = { 0 };for (size_t i = 0; s.size() >= 3; ++i){for (size_t j = 0; j != 3; ++j)str_to_operate[j] = s[j];s = s.substr(3);s_processed += EncodeEach(str_to_operate);}switch (s.size()){case 0:break;case 1:str_to_operate[0] = s[0];str_to_operate[1] = 0;str_to_operate[2] = 0;break;case 2:str_to_operate[0] = s[0];str_to_operate[1] = s[1];str_to_operate[2] = 0;break;}s_processed += EncodeEach(str_to_operate);s = s_processed;return 0;
}string Base64::EncodeEach(char s[3])
{string tmp;tmp.clear();if (s[0] != 0){tmp += Base64EncodeMap[s[0] >> 2];if (s[1] != 0){tmp += Base64EncodeMap[((s[0] & 0x03) << 4) | (s[1] >> 4)];if (s[2] != 0){tmp += Base64EncodeMap[((s[1] & 0x0F) << 2) | (s[2] >> 6)];tmp += Base64EncodeMap[s[2] & 0x3F];}else{tmp += Base64EncodeMap[(s[1] & 0x0F) << 2];tmp += "=";}}else{tmp += Base64EncodeMap[((s[0] & 0x03) << 4)];tmp += "==";}}return tmp;
}int Base64::EncodeWeb(string &s)
{Encode(s);for (string::size_type i = 0; i != s.size(); ++i){if (s[i] == '+')s[i] = '-';else if (s[i] == '/')s[i] = '_';}return 0;
}int Base64::DecodeCheck(const string &s, bool isWebSafe)  //检查待解码的字符串是否是Base64编码而来
{if (isWebSafe == true){for (string::const_iterator it = s.begin(); it != s.end(); ++it)if (!isalnum(*it) && *it != '+' && *it != '/')return -1;}else{for (string::const_iterator it = s.begin(); it != s.end(); ++it)if (!isalnum(*it) && *it != '-' && *it != '_')return -1;}return 0;
}int Base64::Decode(string &s)
{if (DecodeCheck(s, false) != -1){char str_to_operate[4];for (size_t i = 0; s.size() >= 4; ++i){for (size_t j = 0; j != 4; ++j){str_to_operate[j] = Base64DecodeMap[s[j]];}s = s.substr(4);s_processed += (str_to_operate[0] << 2) | (str_to_operate[1] >> 4);s_processed += (str_to_operate[1] << 4) | (str_to_operate[2] >> 2);s_processed += (str_to_operate[2] << 6) | str_to_operate[3];}s = s_processed;}else return -1;return 0;
}
int Base64::DecodeWeb(string &s)
{if (s.size() % 4 == 0){if (!DecodeCheck(s, true)){for (string::size_type i = 0; i != s.size(); ++i){if (s[i] == '-')s[i] = '+';else if (s[i] == '_')s[i] = '/';}Decode(s);return 0;}else return -1;}else return -1;}int main()
{cout<<"1.coding\n2.decoding\noperating(1 or 2):"<<ends;char input;string s;Base64 a;cin >> input;if (input == '1'){cout << "Enter the string to be encrypted:" << endl;cin >> s;a.Encode(s);cout << "Encoding result:\n" << s << endl;}else if (input == '2'){cout << "Enter the string to be decrypted:" << endl;cin >> s;a.Decode(s);cout << "Decoded result:\n" << s << endl;}elsecout << "input error" << endl;pause();return 0;
}

http://www.xdnf.cn/news/848449.html

相关文章:

  • 频率与补偿(下)
  • 一文带你了解MindSpore的知识及安装入手
  • 我收集的搜索引擎
  • 带你深入了解Android Handler的用法
  • Java HashMap 详解
  • 2024热门专业详细解读:信息安全专业及其就业前景(1)
  • UE4动态修改物体材质
  • B 站疯传,堪称最强,10 大免费的白嫖网站
  • 浏览器输入127.0.0.1显示拒绝访问
  • 网络安全入门,渗透测试详细介绍和流程方法
  • Linux---cp和mv命令选项
  • 23种模式——策略模式
  • JavaScript(JS)的indexOf和lastIndexOf函数全解析
  • mydisktest测试软件,MyDiskTest
  • 尤雨溪-基本介绍
  • 你想要的系列:网络请求框架OkHttp3全解系列 - (一)OkHttp的基本使用
  • Ubuntu操作系统
  • 三十分钟学会SCALA
  • http状态码301和302详解及区别
  • 量化交易是什么?
  • 《MFC 学习笔记》 1 —— 窗口
  • 史上最详细sqlmap入门教程
  • 【Git】git常用命令大全(初学者必看!!最强详解!!)
  • CSRF攻击原理介绍和利用
  • Simulink 环境基础知识(九)--指定模块属性
  • 获取传感器温度-cpu 温度篇
  • yml 简介(springboot 必备基础,小白入门)
  • Android View 的scroll相关方法属性 以及Scroller弹性滑动原理
  • SVM通俗详解
  • 一文教你搞懂python函数装饰器(wrapper)