Hex编码与Base64编码
Hex编码与Base64编码
- 什么是明文
- 什么是编码
- Hex编码
- Hex编码实现细节
- 自定义Hex编码
- Base64编码
- Base64编码实现细节
- 自定义Base64编码
什么是明文
介绍什么是编码之前,首先了解下什么是明文,表示其本身意思的,他就是明文
比如你看到"E6988E",如果是明文他就代表他自己,也就是当他表示"E6988E"时,
但是他如果是Hex编码后的,那他就代表"明"
什么是编码
由于计算机存储的都是二进制数,得通过编码转换成人能认识得东西,中文就是UTF8编码或者Unicode编码后的结果有些网站不想让你看到他发送至服务端的数据,会通过加密算法对数据进行加密(对字节进行位运算),加密完把字节toString会导致乱码(位运算完的字节大多数无法在UTF8码表或者Unicode编码中找到可见字符),所以有了Hex编码和Base64编码
Hex编码
Hex编码是一种用16个字符(0123456789ABCDEF)表示任意二进制数据的方法,是一种编码,并非加密字符编码,“明"通过Hex编码后是"E6988E”
Hex编码实现细节
//查看com.sun.org.apache.xerces.internal.impl.dv.util下HexBin类可知static public String encode(byte[] binaryData) {if (binaryData == null)return null;int lengthData = binaryData.length;//由此可见,Hex编码的字节长度是原字节长度的2倍int lengthEncode = lengthData * 2;char[] encodedData = new char[lengthEncode];int temp;for (int i = 0; i < lengthData; i++) {temp = binaryData[i];//这里是有符号数转无符号数if (temp < 0)temp += 256;//lookUpHexAlphabet就是码表//取当前字节的高四位encodedData[i*2] = lookUpHexAlphabet[temp >> 4];//取当前字节的低四位encodedData[i*2+1] = lookUpHexAlphabet[temp & 0xf];}return new String(encodedData);}
由此可知,Hex编码就是分别获取前字节的高四位和低四位转换成十进制数,当作索引去码表里面获取对应的字符拼接返回
二进制数00000000-00001111代表的范围是0-15,和码表里面的字符一一对应
PS:8位为一个字节,取出来四位后会在前面补零,然后转10进制
自定义Hex编码
了解清楚Hex编码的实现机制后,就可以开始自定义Hex编码了,能看到这里把HexBin的方法扣过来,编码出来的结果是一样的,改一下码表就能实现自定义Hex编码了
当我们把码表换了后,编码出来的数据与之前完全不一样了,因为相同的索引对应的字符已经不是之前那个了,如果需要解码成功,也需要更换解码的码表,否则会乱码
Base64编码
Base64是一种用64个字符表示任意二进制数据的方法,是一种编码,并非加密字符编码
由 A-Z a-z 0-9 + / 和补充字符 “=” 组成,Base64编码后的字符数是4的倍数(不足会补"=")
Base64编码实现细节
具体和Hex编码类似
Hex编码是4个比特转换成一个新的字符串,Base64是6个比特转换成一个新的字符串,而6个比特(0011 1111)最能表示的十进制数为63,加上0为64,跟进源码可以看出,Base64有俩码表
因为"+“和”/"出现在url中的话,后端接收会出问题
什么时候补"="
比如针对字符"S",字符"S"在UTF8码表中为:83,所以字符串"S"的二进制数为:0101 0011
由于Base64编码以6个比特位一组进行编码,所以可以写为:010100 11
由于不足补零得到二进制数:010100 110000
Base64编码后的字符数是4的倍数所以得到二进制数:010100 110000 000000 000000
然后6个比特为一组,转换成十进制数可得:20和48,由于后面俩组比特位是补位来的,会直接转换成"="字符
在Base64码表中20对应得字符是"U"
在Base64码表中48对应得字符是"w"
PS:标准的Base64码表是A-Z a-z 0-9 + / 按顺序来的
所以字符串"S"的Base64编码结果位:Uw==
自定义Base64编码
和自定义Hex编码同理,修改码表即可,对应解码也需要使用修改后的码表
Hex编码与Base64编码相关推荐
- base64 加密有空格 换行_[编码解码] Base64 编码换行和+号遍空格的处理
Android自身带有Base64加密与解密的包,可以方便地加密密码方便传输. String base64Token = Base64.encodeToString(token.trim().getB ...
- URL编码和Base64编码
URL编码和Base64编码 前言 一.URL编码 1. URLEncoder和URLDecoder 2. URL编码规则 3. Javascript 原生提供三对 Url编码 的函数 3.1 三对函 ...
- 网络传输中的那些编码之-base64编码
在前面一篇文章中,这里介绍了URL编码的一些知识点,本文将对网络中另外一个常见的编码方式base64编码进行介绍. 同样的,按照之前的介绍方式,本文将从如下几个方面进行介绍: 什么是base64编码 ...
- ios php tpbase64编码,iOS Base64编码
一.介绍 Base64编码是一种数据编码方式,目的是让数据符合传输协议的要求.能够将任何二进制数据,转换成只有64 +1("="等号)个字符组成的文本文件. 提示:Base64不是 ...
- PHP 图片转base64编码 和 base64编码字符串转换成图片保存
1.图片转base64编码: /*图片转换为 base64格式编码*/ $img = 'uploads/01.png'; $base64_img = base64EncodeImage($img); ...
- Unicode编码和Base64编码
Unicode JavaScript 定义了 6 个全局方法用于 Unicode 字符串的编码和解码,说明如表所示. 方法 说明 escape() 使用转义序列替换某些字符来对字符串进行编码 unes ...
- 编码算法(URL编码和Base64编码)
URL编码: URL 编码是浏览器发送数据给服务器时使用的编码,它通常附加在 URL 的参数部 分,例如: https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87. ...
- MIME之quoted-printable编码与base64编码(例题+图解)
(1)quoted-printable编码 quoted-printable编码方法适合所传输数据中只有少量的非ASCII编码,用一个等号"="后面加两个数字字符来表示一个非ASC ...
- indy html 编码,INDY10 BASE64编码
INDY10 BASE64编码 DELPHI自带的BASE64单元,在项目中使用发现非常没有效率,INDY10的好用. uses IdCoderMIME BASE64编码类:TIdEncoderMIM ...
- php解压base64编码,php base64编码和urlencode
Revit如何模型导入到InfraWorks中 Infraworks也就是以前的Autodesk Infrastructure Modeler(AIM)作为一款优秀的概念设计软件,能接收来自各种来源的 ...
最新文章
- c# hash 泛型_C# 泛型Dictionary (Hashtable)
- java并发编程线程安全
- ASP.NET Web API 中 特性路由(Attribute Routing) 的重名问题
- 台式计算机性能清单是强制的吗,教你识别良心商家和奸商电脑配置清单区别以及如何选购台式电脑机箱...
- 反汇编基础-数组和指针的反汇编代码分析
- hdu 敌兵布阵(线段树之单点更新)
- ARM学习系列 ---- ARM公司简介
- 【bp靶场portswigger-服务端2】身份认证漏洞-16个实验(全)
- 全加器在计算机的应用,如何用半加器实现全加器?
- 超实用硬盘数据恢复工具介绍!永久免费
- 海康萤石的本地在线码流
- 我的生活与程序员职业规划
- 第一本十五章上级2注册账号
- Win8卸载2345看图王
- html兼容ie7ie8,解决IE6、IE7、IE8样式不兼容问题
- Kindle退出中国怎么办?
- java方法怎么用?【java方法使用教程】
- word2010设置多级别标题
- 想买车的注意啦!一针见血,点评100多款在产汽车
- 【fpga】ddr3