Base16简介
1、将二进制的数据转换为十六进制(0x&&)来进行显示。
2、原二进制一个字节为8个比特,而一位十六进制字符代表的是四位二进制,所以原二进制的一个字节转换成了两个十六进制的字符,两个字符就是两个字节。是原来大小的两倍
Base16实现
1、准备
首先看ASCII字符代码表,确定我们用到的十六进制字符即:48位-57位(0-9映射为0-9);65位-71位(A-F映射为10-15)。
Ps:由于两部分不连续,所以写编码和解码的时候都要重新生成一个表,减小时间损耗。
2、代码实现(编写环境Vs2019)
#include<iostream>
using namespace std;
//制作一个全局的静态转ASCII码的对应关系。四位二进制是0-15所以我们对应写出转换后的16进制字符即可即0-F
static const char BASE16_ENC_TAB[] = "0123456789ABCDEF";
static const char BASE16_DNC_TAB[128] = {
//'0-9'对应48-57 'A-F'对应65-70
-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-50
3, 4, 5, 6, 7, 8, 9,-1,-1,-1, //51-60 0-9
-1,-1,-1,-1,10,11,12,13,14,15 //61-70 A-F
}; //转换接口
int Base16Encode(const unsigned char* in, int size, char* out)//此处传递的不一定是字符串,也有可能是二进制数据所以要制定数据的大小int size
{
for (int i = 0; i < size; i++)
{
//一个字节取出高4位和低4位
char h = in[i] >> 4; //使用高位部分右移将低位部分覆盖,原高位补零
char l = in[i] & 0x0F;//高位与0,去掉高位;低位与1,低位不变
out[i * 2] = BASE16_ENC_TAB[h];//0-15映射到对应字符
out[i * 2 + 1] = BASE16_ENC_TAB[l];
}
return size * 2;//base16转码后空间扩大一倍,一个字节有八个bit位,转码后4个比特位转化成一个字符,所以一个字节转成了两个字符。
}
//解码接口
int Base16Decode(const string& in, unsigned char* out)
{
//将两个字符拼成一个字节 转码后的:B2E2CAD442617365313600
for (int i = 0; i < in.size(); i += 2)
{
unsigned char ch = in[i]; //高位转换的字符 ‘B’=>66 : 10
unsigned char cl = in[i + 1]; // 低位转换的字符'2'=>50: 2
unsigned char h = BASE16_DNC_TAB[ch];//转换成原来的值
unsigned char l = BASE16_DNC_TAB[cl];
//两个4位拼成一个字节(8位)
//高四位 1000 >>4 1000 0000
//低四位 0001 0000 0001
out[i / 2] = 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);//输入长度size
char out1[1024] = {
0 };//输出空间大小,初始化为0
unsigned char out2[1024] = {
0 };
int re = Base16Encode(data, len, out1);
cout << re << ":" << out1 << endl;
re = Base16Decode(out1, out2);
cout << re << ":" << out2 << endl;
return 0;
}
3、实现效果