Base16的编码和解码原理及代码

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、实现效果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44827634/article/details/124661712