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-503, 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)
{//将两个字符拼成一个字节 转码后的: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_DNC_TAB[ch];//转换成原来的值unsigned char l = BASE16_DNC_TAB[cl];//两个4位拼成一个字节(8位)//高四位 1000 >>4 1000 0000//低四位 0001 0000 0001out[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);//输入长度sizechar out1[1024] = { 0 };//输出空间大小,初始化为0unsigned 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、实现效果
Base16的编码和解码原理及代码相关推荐
- 彻底弄懂base64的编码与解码原理
作者介绍 背景 base64的编码原理网上讲解较多,但解码原理讲解较少,并且没有对其中的内部实现原理进行剖析.想要彻底了解base64的编码与解码原理,请耐心看完此文,你一定会有所收获. 涉及算法与逻 ...
- 音视频同步原理解析;音频编码和解码原理
视频流中的DTS/PTS到底是什么? DTS(解码时间戳)和PTS(显示时间戳)分别是解码器进行解码和显示帧时相对于SCR(系统参考)的时间戳.SCR可以理解为解码器应该开始从磁盘读取数据时的时间. ...
- WAV系列之二:ADPCM编解码原理及代码实现
参考自:<adpcm编解码原理及其代码实现> <ADPCM编码与解码学习笔记> <音频编码:ADPCM> 文章目录 1.PCM 1.1.采样 1.2.量化编码 2. ...
- java 流 改变编码_Java-IO流之转换流的使用和编码与解码原理
一.理论: 1.字符流和字节流区别是什么? 字符流=字节流+编码集,在实际读取的时候其实字符流还是按照字节来读取,但是会更具编码集进行查找编码集字典解析相应的字节,使得一次读取出一个字符: 2.什么是 ...
- adpcm编解码原理及其代码实现
目录 1. 源代码 adpcm.h adpcm.c 2. adpcm编解码原理 1.adpcm编码原理 2.adpcm解码原理 注释说明 3. ADPCM数据存放形式 1. adpcm 数据块介绍 2 ...
- opus 编码和解码完整demo代码,opus和wav互转(js源码)
最近研究webRTC中的opus音频的解码.找了很多例子都不了.不是代码太老,就是运行环境有问题.因此,自己结合大神的示例,整理了编码和解码的完整demo源码. opus解码demo可将opus文件保 ...
- 红外遥控解码原理及代码实现
本篇介绍红外解码的原理和程序的写法. 下面来看一下,红外线是如何编码的.![这里写图片描述](https://img-blog.csdn.net/20150926130659823) 下面来具体说一下 ...
- FFmpeg在Windows上设置dshow mjpeg编码+libyuv解码显示测试代码
之前在https://blog.csdn.net/fengbingchun/article/details/103444891中介绍过在Windows上通过ffmpeg dshow设置为mjpeg编解 ...
- URL编码及解码原理
URL编码和Base64编码是不一样的,URL编码有专门的标准,目前Java11中使用的是RFC2396(参考:https://www.ietf.org/rfc/rfc2396.txt). 在 jav ...
- Python-base编码和解码方法
文章目录 前言 一.函数介绍 二.base16 [1]. 编码 [2]. 解码 三.base32 [1]. 编码 [2]. 解码 四.base64 [1]. 编码 [2]. 解码 前言 仅介绍pyth ...
最新文章
- bzoj 5092: [Lydsy1711月赛]分割序列
- easyui 中combogrid 实现多选,反选效果
- Apache Kafka-生产消费基础篇
- ways to improve your presentation by your own
- Acwing 218. 扑克牌
- C语言实现单链表操作
- 根据经纬度计算范围_高中地理必修一二三思维导图+计算公式全汇总!能用3年...
- 谷歌微软等公司承诺大力投资于网络安全建设
- [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
- 使用Oracle Wrap工具加密你的代码
- LibMeshEquationSystem 类接口
- 反转链表与链表实现两数相加(简单思路)
- 潮流计算程序————电力网络的节点编号优化(Tinney-1编号)(Python语言描述)
- MATLAB与STK互联23:卫星对象操作(14)—仿真分析案例1,建立8个地面站,分析对卫星的可见性
- ftpclient覆盖上传文件
- Android接入腾讯Bugly统计SDK
- 从网站细节入手提高易用性
- 上一主题 下一主题 一个微信账号登陆信息提取软件,有人知道吗?
- 提高QPS方法基本思路
- JAVA程序员和C程序员的差距在哪里?