网站的建站标准,邯郸网络教研平台,婚礼请柬电子版免费制作app,高港区住房和城乡建设局网站文章目录 ASCII表概述base家族简单说明 Hex(十六进制)编码、Base32编码、Base64编码、base256编码base16编码与解码base64编码概述转换过程不足 3 字节处理方法例子一,不足3字节#xff0c;只有一个字节例子二,不足3字节#xff0c;只有两个字节 base64示例代码1代码分析 acl… 文章目录 ASCII表概述base家族简单说明 Hex(十六进制)编码、Base32编码、Base64编码、base256编码base16编码与解码base64编码概述转换过程不足 3 字节处理方法例子一,不足3字节只有一个字节例子二,不足3字节只有两个字节 base64示例代码1代码分析 acl_base64_encode代码分析 acl_base64_decode base64示例代码2——openssl 实现Base16与Base64优劣对比扩展的ASCII码ASCII 编码一览表控制字符可显示字符 ASCII表概述
ASCIIAmerican Standard Code for Information Interchange美国信息互换标准代码是一套基于拉丁字母的字符编码共收录了 128 个字符用一个字节就可以存储它等同于国际标准 ISO/IEC 646。
ASCII 编码于 1967 年第一次发布最后一次更新是在 1986 年迄今为止共收录了 128 个字符包含了基本的拉丁字母英文字母、阿拉伯数字也就是 1234567890、标点符号,.!等、特殊符号#$%^等以及一些具有控制功能的字符往往不会显示出来。
ASCII 编码是美国人给自己设计的他们并没有考虑欧洲那些扩展的拉丁字母也没有考虑韩语和日语我大中华几万个汉字更是不可能被重视。计算机也是美国人发明的起初使用的就是 ASCII 码只能显示英文字符。各个国家为了让本国公民也能正常使用计算机开始效仿 ASCII 开发自己的字符编码例如 ISO/IEC 8859欧洲字符集、shift_Jis日语字符集、GBK中文字符集等。
base家族简单说明
ASCII 是用1282^8个字符对二进制数据进行编码的方式 base64 编码是用642^6个字符对二进制数据进行编码的方式 base32 就是用322^5个字符对二进制数据进行编码的方式 base16 就是用162^4个字符对二进制数据进行编码的方式
Hex(十六进制)编码、Base32编码、Base64编码、base256编码
Hex(十六进制)编码、Base32编码和Base64编码可以将原始数据编码为可视化字符串。它们的原理是一样的都是将指定位数的原始数据编码为特定字符空间中的一个字符。
Hex也叫作Base16编码每4位编码为一个字符 2 4 16 {2}^{4}16 2416 字符空间为0123456789abcdef或0123456789ABCDEF不区分大小写其中的字母可以编码为大写也可以编码为小写同时解码也不区分大小写应该能对大小写的HEX字符串都能正确解码Base32每5位编码为一个字符 2 5 32 {2}^{5}32 2532 字符空间为ABCDEFGHIJKLMNOPQRSTUVWXYZ234567大小写敏感Base64每6位编码为一个字符 2 6 64 {2}^{6}64 2664 字符空间为ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/大小写敏感Base256: 每8位编码为一个字符也就是8位一个字节。因为 2 8 256 {2}^{8}256 28256 所以可以把我们普通的编码叫base256。
base16编码与解码
Base16编码使用16个ASCII字符对任何数据进行编码Base16与Base64的实现原理类似同样是将原数据二进制形式取指定位数转换为ASCII码。首先获取数据的二进制形式将其串联起来每4个比特为一组进行切分每一组内的4个比特可转换到指定的16个ASCII字符中的一个将转换后的ASCII字符连接起来就是编码后的数据。
base16编码与解码示例
#include iostreamusing namespace std;
static const char BASE16_ENC_TAB[] 0123456789ABCDEF;
// 0~9 48~57 A~F 65~70
static const char BASE16_DEC_TAB[128] {-1, //0-1,-1,-1,-1,-1, -1,-1,-1,-1,-1, //1-10-1,-1,-1,-1,-1, -1,-1,-1,-1,-1, //11-20-1,-1,-1,-1,-1, -1,-1,-1,-1,-1, //21-30-1,-1,-1,-1,-1, -1,-1,-1,-1,-1, //31-40-1,-1,-1,-1,-1, -1,-1, 0, 1, 2, //41-503, 4, 5, 6, 7, 8, 9,-1,-1,-1, //51-60-1,-1,-1,-1,10, 11,12,13,14,15 //61-70 A-F
};int Base16Encode(const unsigned char* in, int size, char* out)
{for (int i 0; i size; i) {char h in[i] 4; //移位丢弃低位char l in[i] 0x0F; //0000 1111 去掉高位out[i * 2] BASE16_ENC_TAB[h];out[i * 2 1] BASE16_ENC_TAB[l];}//base16 转码后空间扩大一倍 4位转成一个字符 1个字节转成两个字符return size * 2;
}int Base16Decode(const string in, unsigned char* out)
{//将两个字符拼成一个字节 B2E2CAD442617365313600for (int i 0; i in.size(); i 2){unsigned char ch in[i]; //高位转换的字符 B 66 : 10unsigned char cl in[i 1]; //低位转换的字符 2 50 : 2unsigned char h BASE16_DEC_TAB[ch]; //转换成原来的值unsigned char l BASE16_DEC_TAB[cl];//两个4位拼成一个字节 (8位)// 1000 4 1000 0000// 0001 0000 0001// |1000 0001out[i / 2] (int)(h 4 | l);}return in.size() / 2;
}int main(int argc, char* argv[])
{cout Test Base16 endl;const unsigned char data[] 测试Base16;int len sizeof(data);char out1[1024] { 0 };cout data endl;int re Base16Encode(data, len, out1);unsigned char out2[1024] { 0 };re Base16Decode(out1, out2);cout re : out2 endl;return 0;
}
base64编码概述
Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法由于 2^664所以每 6 个比特为一个单元对应某个可打印字符。
Base64 常用于在通常处理文本数据的场合表示、传输、存储一些二进制数据包括 MIME 的电子邮件及 XML 的一些复杂数据。
Base64 编码要求把 3 个 8 位字节3*824转化为 4 个 6 位的字节4*624之后在 6 位的前面补两个 0形成 8 位一个字节的形式。 如果剩下的字符不足 3 个字节则用 0 填充输出字符使用 因此编码后输出的文本末尾可能会出现 1 或 2 个 。
为了保证所输出的编码位可读字符Base64 制定了一个编码表以便进行统一转换。编码表的大小为 2^664这也是 Base64 名称的由来。
在 Base64 中的可打印字符包括26个大写字母 A-Z、26个小写字母a-z、数字 0-9这样共有 62 个字符此外两个可打印符号在不同的系统中而不同。
以下是 Base64 编码的基本步骤
将数据划分为 3 个字节一组24位。将每个字节转换为 8 位二进制形式。将 24 位数据按照 6 位一组进行划分得到 4 个 6 位的组。将每个 6 位的组转换为对应的 Base64 字符。如果数据不足 3 字节进行填充。将所有转换后的 Base64 字符连接起来形成最终的编码结果。
解码 Base64 编码的过程与编码相反将每个 Base64 字符转换为对应的6位二进制值然后将这些 6 位值组合成原始的二进制数据。
Base64 编码具有以下特点
编码后的数据长度总是比原始数据长约 1/3。编码后的数据可以包含 A-Z、a-z、0-9 和两个额外字符的任意组合。Base64 编码是一种可逆的编码方式可以通过解码还原原始数据。
转换过程
编码 “Man” 的结果为 TWFu转换过程如下
不足 3 字节处理方法
例子一,不足3字节只有一个字节 已知末尾文本为A对应原始数据二进制为01000001一个字节不满足转换要求。转换要求必须要有三个字节这里只有一个字节所以要进行填充。从上图可知填充分两种情况A对应原始数据二进制的前六位可以正常转换后两位之后填充0现在已经两个单元但是四个单元才可以转换。这里根据Base64编码规则用两个等于号来填充。这样就保证了数据内容不变长度可观测。
例子二,不足3字节只有两个字节 已知末尾文本为BC。对应原始数据二进制为0100001001000011两个字节不满足转换要求。转换要求必须要有三个字节这里只有两个字节所以要进行填充。
base64示例代码1
//
// Created by oceanstar on 2021/8/13.
//
#include cstdlib
#include acl_base64.hnamespace oceanstar{static const unsigned char to_b64[] ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/;static const unsigned char un_b64[] {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 255, 255, 255,255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};#define UNSIG_CHAR_PTR(x) ((const unsigned char *)(x))unsigned char *acl_base64_encode( const char *in, int len){const unsigned char *cp;int count, size len * 4 /3;unsigned char * out (unsigned char *)malloc(size 1);int out_index 0;for (cp UNSIG_CHAR_PTR(in), count len; count 0; count - 3, cp 3) {out[out_index] to_b64[cp[0] 2];if (count 1) {out[out_index] to_b64[(cp[0] 0x3) 4 | cp[1] 4];if (count 2) {out[out_index] to_b64[(cp[1] 0xf) 2 | cp[2] 6];out[out_index] to_b64[cp[2] 0x3f];}else{out[out_index] to_b64[(cp[1] 0xf) 2];out[out_index] ;break;}} else {out[out_index] to_b64[(cp[0] 0x3) 4];out[out_index] ;out[out_index] ;break;}}out[out_index] 0;return out;}unsigned char *acl_base64_decode(const char *in, int len){const unsigned char *cp;int count;int ch0;int ch1;int ch2;int ch3;/** Sanity check.*/if (len % 4)return (NULL);#define INVALID 0xffunsigned char * out (unsigned char *)malloc(len 1);int out_index 0;for (cp UNSIG_CHAR_PTR(in), count 0; count len; count 4) {if ((ch0 un_b64[*cp]) INVALID|| (ch1 un_b64[*cp]) INVALID)return (0);out[out_index] ch0 2 | ch1 4;if ((ch2 *cp) )break;if ((ch2 un_b64[ch2]) INVALID)return (0);out[out_index] ch1 4 | ch2 2;if ((ch3 *cp) )break;if ((ch3 un_b64[ch3]) INVALID)return (0);out[out_index] ch2 6 | ch3;}out[out_index] 0;return out;}}
代码分析 acl_base64_encode
编码过程简单来说就是8 x 3 6 x 4的过程。
// 当count等于3时执行的是
out[out_index] to_b64[cp[0] 2];
out[out_index] to_b64[(cp[0] 0x3) 4 | cp[1] 4]; // 0x3 --- 0000 0011
out[out_index] to_b64[(cp[1] 0xf) 2 | cp[2] 6]; // 0xf --- 0000 1111
out[out_index] to_b64[cp[2] 0x3f]; // 0x3f --- 0011 1111// 当count等于2时执行的是
out[out_index] to_b64[cp[0] 2];
out[out_index] to_b64[(cp[0] 0x3) 4 | cp[1] 4];
out[out_index] to_b64[(cp[1] 0xf) 2];
out[out_index] ;// 当count等于1时执行的是
out[out_index] to_b64[cp[0] 2];
out[out_index] to_b64[(cp[0] 0x3) 4];
out[out_index] ;
out[out_index] ;代码分析 acl_base64_decode
解码过程简单来说就是6 x 4 8 x 3的过程。
//当满足4个单元时
out[out_index] ch0 2 | ch1 4;
out[out_index] ch1 4 | ch2 2;
out[out_index] ch2 6 | ch3;base64示例代码2——openssl 实现
#include openssl/sha.h
#include openssl/pem.h
#include openssl/bio.h
#include openssl/evp.h
int base64_encode(char *in_str, int in_len, char *out_str) {BIO *b64, *bio;BUF_MEM *bptr NULL;size_t size 0;if (in_str NULL || out_str NULL)return -1;b64 BIO_new(BIO_f_base64());bio BIO_new(BIO_s_mem());bio BIO_push(b64, bio);BIO_write(bio, in_str, in_len);BIO_flush(bio);BIO_get_mem_ptr(bio, bptr);memcpy(out_str, bptr-data, bptr-length);out_str[bptr-length-1] \0;size bptr-length;BIO_free_all(bio);return size;
}
Base16与Base64优劣对比 Base16使用了更小的字典Base16包含16个字符0-9A-FBase64包含65个字符a-zA-Z0-9/或a-zA-Z0-9-_。 Base16编码规则是4比特为一分组Base64编码规则是6比特为一分组。 由于编码规则的不同Base16正好可以完全切分数据无需补位Base64无法完全切分数据需要使用补位 补位的个数在{012}范围之内。 Base16编码后数据会膨胀一倍Base64编码后数据会膨胀1/3。 Base16编码后数据无特殊字符而Base64包含特殊字符。Base64在URL传输等场景下需要尤为注意特殊字符的处理。
扩展的ASCII码
ASCII码值在128-255间的ASCII码称作扩展的ASCII码。
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码使用7 位二进制数剩下的1位二进制为0来表示所有的大写和小写字母数字0 到9、标点符号 以及在美式英语中使用的特殊控制字符。
其中031及127(共33个)是控制字符或通信专用字符其余为可显示字符如控制符LF换行、CR回车、FF换页、DEL删除、BS退格)、BEL响铃等。
32126(共95个)是字符(32是空格其中4857为0到9十个阿拉伯数字。
6590为26个大写英文字母97122号为26个小写英文字母其余为一些标点符号、运算符号等。
后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展或“高”ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。
ASCII 编码一览表
ASCII 编码一览表
控制字符
二进制十进制十六进制字符/缩写解释00000000000NUL (NULL)空字符00000001101SOH (Start Of Headling)标题开始00000010202STX (Start Of Text)正文开始00000011303ETX (End Of Text)正文结束00000100404EOT (End Of Transmission)传输结束00000101505ENQ (Enquiry)请求00000110606ACK (Acknowledge)回应/响应/收到通知00000111707BEL (Bell)响铃00001000808BS (Backspace)退格00001001909HT (Horizontal Tab)水平制表符00001010100ALF/NL(Line Feed/New Line)换行键00001011110BVT (Vertical Tab)垂直制表符00001100120CFF/NP (Form Feed/New Page)换页键00001101130DCR (Carriage Return)回车键00001110140ESO (Shift Out)不用切换00001111150FSI (Shift In)启用切换000100001610DLE (Data Link Escape)数据链路转义000100011711DC1/XON (Device Control 1/Transmission On)设备控制1/传输开始000100101812DC2 (Device Control 2)设备控制2000100111913DC3/XOFF (Device Control 3/Transmission Off)设备控制3/传输中断000101002014DC4 (Device Control 4)设备控制4000101012115NAK (Negative Acknowledge)无响应/非正常响应/拒绝接收000101102216SYN (Synchronous Idle)同步空闲000101112317ETB (End of Transmission Block)传输块结束/块传输终止000110002418CAN (Cancel)取消000110012519EM (End of Medium)已到介质末端/介质存储已满/介质中断00011010261ASUB (Substitute)替补/替换00011011271BESC (Escape)逃离/取消00011100281CFS (File Separator)文件分割符00011101291DGS (Group Separator)组分隔符/分组符00011110301ERS (Record Separator)记录分离符00011111311FUS (Unit Separator)单元分隔符011111111277FDEL (Delete)删除
可显示字符
二进制十进制十六进制字符/缩写解释001000003220(Space)空格001000013321!001000103422001000113523#001001003624$001001013725%001001103826001001113927’001010004028(001010014129)00101010422A*00101011432B00101100442C,00101101452D-00101110462E.00101111472F/001100004830000110001493110011001050322001100115133300110100523440011010153355001101105436600110111553770011100056388001110015739900111010583A:00111011593B;00111100603C00111101613D00111110623E00111111633F?010000006440010000016541A010000106642B010000116743C010001006844D010001016945E010001107046F010001117147G010010007248H010010017349I01001010744AJ01001011754BK01001100764CL01001101774DM01001110784EN01001111794FO010100008050P010100018151Q010100108252R010100118353S010101008454T010101018555U010101108656V010101118757W010110008858X010110018959Y01011010905AZ01011011915B[01011100925C\01011101935D]01011110945E^01011111955F_011000009660011000019761a011000109862b011000119963c0110010010064d0110010110165e0110011010266f0110011110367g0110100010468h0110100110569i011010101066Aj011010111076Bk011011001086Cl011011011096Dm011011101106En011011111116Fo0111000011270p0111000111371q0111001011472r0111001111573s0111010011674t0111010111775u0111011011876v0111011111977w0111100012078x0111100112179y011110101227Az011110111237B{011111001247C|011111011257D}011111101267E~ 文章转载自: http://www.morning.nccyc.cn.gov.cn.nccyc.cn http://www.morning.cfqyx.cn.gov.cn.cfqyx.cn http://www.morning.nbpqx.cn.gov.cn.nbpqx.cn http://www.morning.grqlc.cn.gov.cn.grqlc.cn http://www.morning.kxscs.cn.gov.cn.kxscs.cn http://www.morning.kqhlm.cn.gov.cn.kqhlm.cn http://www.morning.mftzm.cn.gov.cn.mftzm.cn http://www.morning.tkztx.cn.gov.cn.tkztx.cn http://www.morning.kwqwp.cn.gov.cn.kwqwp.cn http://www.morning.nbwyk.cn.gov.cn.nbwyk.cn http://www.morning.rcklc.cn.gov.cn.rcklc.cn http://www.morning.chxsn.cn.gov.cn.chxsn.cn http://www.morning.cqwb25.cn.gov.cn.cqwb25.cn http://www.morning.kdxzy.cn.gov.cn.kdxzy.cn http://www.morning.thjqk.cn.gov.cn.thjqk.cn http://www.morning.hslgq.cn.gov.cn.hslgq.cn http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn http://www.morning.yngtl.cn.gov.cn.yngtl.cn http://www.morning.wnywk.cn.gov.cn.wnywk.cn http://www.morning.bnfsw.cn.gov.cn.bnfsw.cn http://www.morning.fwdln.cn.gov.cn.fwdln.cn http://www.morning.rnnwd.cn.gov.cn.rnnwd.cn http://www.morning.zcnwg.cn.gov.cn.zcnwg.cn http://www.morning.crxdn.cn.gov.cn.crxdn.cn http://www.morning.mhrzd.cn.gov.cn.mhrzd.cn http://www.morning.qwnqt.cn.gov.cn.qwnqt.cn http://www.morning.dxrbp.cn.gov.cn.dxrbp.cn http://www.morning.mbpzw.cn.gov.cn.mbpzw.cn http://www.morning.xxrwp.cn.gov.cn.xxrwp.cn http://www.morning.ysrtj.cn.gov.cn.ysrtj.cn http://www.morning.rcrnw.cn.gov.cn.rcrnw.cn http://www.morning.llxqj.cn.gov.cn.llxqj.cn http://www.morning.rdmz.cn.gov.cn.rdmz.cn http://www.morning.pbwcq.cn.gov.cn.pbwcq.cn http://www.morning.fddfn.cn.gov.cn.fddfn.cn http://www.morning.webife.com.gov.cn.webife.com http://www.morning.lwlnw.cn.gov.cn.lwlnw.cn http://www.morning.mumgou.com.gov.cn.mumgou.com http://www.morning.snxbf.cn.gov.cn.snxbf.cn http://www.morning.mzcrs.cn.gov.cn.mzcrs.cn http://www.morning.cfjyr.cn.gov.cn.cfjyr.cn http://www.morning.bhxzx.cn.gov.cn.bhxzx.cn http://www.morning.frcxx.cn.gov.cn.frcxx.cn http://www.morning.gpmrj.cn.gov.cn.gpmrj.cn http://www.morning.wbxrl.cn.gov.cn.wbxrl.cn http://www.morning.fktlg.cn.gov.cn.fktlg.cn http://www.morning.kryr.cn.gov.cn.kryr.cn http://www.morning.jwxnr.cn.gov.cn.jwxnr.cn http://www.morning.mnqz.cn.gov.cn.mnqz.cn http://www.morning.xtgzp.cn.gov.cn.xtgzp.cn http://www.morning.dhqzc.cn.gov.cn.dhqzc.cn http://www.morning.xirfr.cn.gov.cn.xirfr.cn http://www.morning.kmldm.cn.gov.cn.kmldm.cn http://www.morning.dlwzm.cn.gov.cn.dlwzm.cn http://www.morning.jklns.cn.gov.cn.jklns.cn http://www.morning.gwjsm.cn.gov.cn.gwjsm.cn http://www.morning.trjdr.cn.gov.cn.trjdr.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.sqdjn.cn.gov.cn.sqdjn.cn http://www.morning.xyhql.cn.gov.cn.xyhql.cn http://www.morning.21r000.cn.gov.cn.21r000.cn http://www.morning.ydwnc.cn.gov.cn.ydwnc.cn http://www.morning.qydgk.cn.gov.cn.qydgk.cn http://www.morning.qcdhg.cn.gov.cn.qcdhg.cn http://www.morning.tcylt.cn.gov.cn.tcylt.cn http://www.morning.qzpkr.cn.gov.cn.qzpkr.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.nfpkx.cn.gov.cn.nfpkx.cn http://www.morning.gpsr.cn.gov.cn.gpsr.cn http://www.morning.dnjwm.cn.gov.cn.dnjwm.cn http://www.morning.wtxdp.cn.gov.cn.wtxdp.cn http://www.morning.ljdhj.cn.gov.cn.ljdhj.cn http://www.morning.ckfqt.cn.gov.cn.ckfqt.cn http://www.morning.xfmwk.cn.gov.cn.xfmwk.cn http://www.morning.flzqq.cn.gov.cn.flzqq.cn http://www.morning.jsdntd.com.gov.cn.jsdntd.com http://www.morning.tqfnf.cn.gov.cn.tqfnf.cn http://www.morning.feites.com.gov.cn.feites.com http://www.morning.ryxyz.cn.gov.cn.ryxyz.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn