Base64编码与解码
2015-09-12 12:06
183 查看
Base64是什么
Base64是一种将二进制编码成64个可见字符的编码方式。Base64编码把3个8位字节转化为4个6位的字节。如果不足3个字节,则用0填充,输出字符末尾补’=’,因此编码后输出的文本末尾可能会出现1或2个’=’。为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。
比如加密字符A
字符A的ASCII码是65,二进制为01000001
不足24位,末尾补0,变为01000001 00000000 00000000
由于添加了2个8位,所以最终结果要补充2个’=’
划分为4个6位,变为010000 01 0000 000000 000000
查表可得010000对应’Q’,因此最终结果为”QQ==”
实现代码
#ifndef BASE64_H #define BASE64_H class Base64 { public: Base64(); bool Encode(const unsigned char* bytes, int size, char* str, int maxLen); bool Decode(unsigned char* bytes, int& size, const char* str, int maxSize); int SizeToLen(int size); int LenToSize(int len); virtual ~Base64(); protected: private: static const char* table; int getIdx(char chr); }; #endif // BASE64_H
#include "Base64.h" Base64::Base64() { } Base64::~Base64() { } const char* Base64::table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int Base64::SizeToLen(int size) { return (size+1)*8%6; } int Base64::LenToSize(int len) { return len*6/8; } bool Base64::Encode(const unsigned char* bytes, int size, char* str, int maxLen) { unsigned long bit = 0; unsigned long idx[4]; int len = 0; int add = 0; for (int i = 0; i < size; i += 3) { bit = 0; for (int j = 0; j < 3; j++) { bit <<= 8; if (i + j < size) bit |= bytes[i + j]; else add++; } for (int j = 3; j >= 0; j--) { if (add) { idx[j] = '='; add--; } else idx[j] = table[bit & 63]; bit >>= 6; } for (int j = 0; j < 4; j++) { if (len >= maxLen) { str[len] = '\0'; return false; } str[len++] = idx[j]; } } str[len] = '\0'; return true; } bool Base64::Decode(unsigned char* bytes, int& size, const char* str, int maxSize) { unsigned long bit = 0; unsigned long idx[3]; size = 0; int add = 0; for (;*str;) { bit = 0; for (int j = 0; j < 4; j++) { bit <<= 6; if (*str == '\0') continue; if (*str != '=') bit |= getIdx(*str); else add++; str++; } for (int j = 2; j >= 0; j--) { idx[j] = bit & 255; bit >>= 8; } for (int j = 0; j < 3 - add; j++) { if (size >= maxSize) { bytes[size] = 0; return false; } bytes[size++] = idx[j]; } } bytes[size] = 0; size--; return true; } int Base64::getIdx(char chr) { if (chr >= 'A' && chr <= 'Z') return chr - 'A'; if (chr >= 'a' && chr <= 'z') return chr - 'a' + 26; if (chr >= '0' && chr <= '9') return chr - '0' + 52; if (chr == '+') return 62; if (chr == '/') return 63; return -1; }
相关文章推荐
- 求职之路(拿到百度、美团、趋势科技、华为offer)
- ASP.NET-自定义HttpModule与HttpHandler介绍
- Leetcode: H-Index
- php读取网络文件 curl, fsockopen ,file_get_contents 几个方法的效率对比
- Matlab2014b与C/C++(VS2013)混合编程(未完)
- Qt的QPlainTextEdit超过指定行自动刷新清空
- js前端框架汇总
- 华为上机试题:数字问题.
- Google浏览器设置搜索打开新的标签页
- OC-字典的运用
- java接口
- Google浏览器设置搜索打开新的标签页
- Google浏览器设置搜索打开新的标签页
- <Java Web学习初级阶段>JavaScript实现简单网页计算器
- Merge into的使用详解
- Google浏览器设置搜索打开新的标签页
- swun 1388 你的背包
- 【mac】terminal终端 出现[进程已完成]无法使用终端的情况
- UI:关于RGB与16进制颜色值的转换
- 博客凋零 转战CSDN