简析多种编码方式(Hex, Base64, UTF-8)
简析多种编码方式(Hex, Base64, UTF-8)
首先计算机只认得二进制,0和1,所以我们现在看到的字都是经过二进制数据编码后的;计算机能针对0和1的组合做很多事情,这些规则都是人定义的;然后有了字节的概念,8比特一个字节,如01011100就是一个字节;
人定义好计算机的0和1的数据结构做事的时候,如果每个人都用不同的数据结构,不同的定义,就会使得人和人之间让计算机做的事无法统一,也导致无法通讯,所以要一起共同定义一套大家都认同的规则,其中ASCii码就是最初始的交换码,用做记录信息、交互信息的;
相同的字节串不同的编码就会有不同的展示,只有正确的编码才能表达出字符串本身要记载的信息,而信息是面向人的,只有人能识别,才叫信息,只是偶尔被计算机理解;
字节、字符与字符串:
字节是8比特位构成,上传已经说了;
字符是用字节构成的,但多少字节,怎么构成我们认识的唯一的字符?这个由编码格式决定,也就是Unicode、GBK,(为啥要用字节?,因为历史觉得8比特很牛逼啊)
字符串是字符的序列,各种计算机语言不同表示,如Redis就和C的字符串不一样,C是以 ‘\0’ 结尾;我们说的对字符的编码,而不是字符串;
Hex用字符串形式看二进制代码:
首先,二进制文件通常不易于人看,因为人会看眼花,所以必须转为其他进制,16进制是最好的,刚好2字符表示一个字节
Hex编码是以4比特作为一个单位编码,用4是因为计算机进位是2的倍数,而为了能把比特串分割开来,最适中就是取16进制;所以Hex编码就是16进制编码;用于人类比用比特更直观简介的方式看待比特串(马上反应过来比特串),当然取更多位不适合人口算;
然后我们就有了WinHex这个工具的命名;用它修复二进制文件很不错,前提你对该文件二进制构表(一般是具有协议去解析二进制的,我称之为构表协议吧)很熟;
Base64是面向网络的,其实性质也是这样;
Unicode、GBK都是字符串编码:
看到知乎一个alipay的说啥编码和编码格式不同,gbk是unicode的编码格式,简直笑死人;
字符是独一无二的,人类符号系统抽象的产物,世界唯一,全世界的字符构成字符集,字符也是在演进的;而Unicode和GBK等都是字符的一种编码;也就是一个二进制比特串(数字)和字符的映射表;
Java内部是Unicode默认,以及其面向字符、面向字节:
对于一个抽象字符,在Java中的二进制表示当然需要编码,用的就是Unicode,如果源文件存储并非Unicode怎么办呢?当然需要转换,因此Java很多面向字符流的I/O其实都是默认有转换规则存在;
这里提下I/O都分面向字节和字符,其实面向字节就是不管编码,而面向字符是带编码转换,是的一个抽象字符串如 “饭” 是在哪种编码格式都表示 “饭”,因此面向字符I/O指定编码格式很重要,一般不指定采用默认,如win操作系统默认GBK,而linux默认UTF-8;
UTF-8和Unicode是哈夫曼编码:
自己去查一下吧,是哈夫曼编码转换的
Unicode
UTF-8
待补
Hex编码的编码原理:
* Hex编码的原理就是将原来8位的二进制字节打断,分成两个4位的,并且在前面加上4个零,
* 进行补位这样一个8位二进制字节就变成了2个8位的二进制字节,在将新得到的2个二进制字符进行16位进制转换
* 得到的新的16位字符串就是Hex的值,所以 二进制的[72, 69, 88] 《hex》 484558是相等的。
* [72, 69, 88]byte数组的二进制=01001000 01000101 01011000
* 二进制=01001000 01000101 01011000 进行hex的打断操作 0100 1000 0100 0101 0101 1000
* 在加上前面的4个零得到一个新的6个8位二进制 = 00000100 00001000 00000100 00000101 00000101 00001000
* 新的6个8位二进制 进行16进制转换 00000100 00001000 00000100 00000101 00000101 00001000 = 484558
* 总结所以说Hex编码后的二进制长度变为了原来的2倍,所以字节长度增加了一倍。
Hex的编码过程
字符串: HEX
ASCII码: [72,69,88]
二进制码: 01001000 01000101 01011000
重新分组: 0100 1000 0100 0101 0101 1000
高位补零后的二进制码: 00000100 00001000 00000100 00000101 00000101 00001000
十六进制码: 4 8 4 5 5 8
Hex码: 484558
Java 代码实现
package com.gl.test;import org.apache.commons.codec.binary.Hex;import java.util.Arrays;public class TestHex {public static void main(String[] args) {//一个字符串String hex = "HEX";//获取字符串的byte数组byte[] buf = hex.getBytes();//输出byte数组System.out.println(Arrays.toString(buf));//转换成Hex输出System.out.println(Hex.encodeHexString(buf));}
}
maven 依赖
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency>
简析多种编码方式(Hex, Base64, UTF-8)相关推荐
- 记录几种常用编码方式:BASE64、MD5
目录 1. BASE64 1.为什么要使用BASE64编码? 2. C语言实现 2. MD5 2.1. 主要特点 2.2. C语言实现 3. 1. BASE64 1.为什么要使用BASE64编码? 从 ...
- ASCII+Unicode+UTF8(字符编码方式-字节) Base64(字节编码方式-64字符)
Base64 编码是一种可以把二进制文件编码成文本的编码规则.在很多地方地方都有用到,比如我们可以把图像转成 Base64 编码,然后内联到 HTML 或者 CSS 中. Base64 编码用一些很常 ...
- 315Mhz RF射频解码 串口输出方案(支持2262/1527多种编码方式)
315Mhz RF射频解码 串口输出方案 一.简介 二.使用前准备 三.测试方法 四.测试现象 总结 原文链接:https://www.yourcee.com/newsinfo/2929023.htm ...
- [基因遗传算法]进阶之二:最优规划问题--多种编码方式+多变量
参考资料: <遗传算法求解带约束优化问题(源码实现> <有约束的遗传算法(Python代码实现)> <遗传算法原理及其python实现> 同系列文章: <[基 ...
- FPGA之道(56)状态的编码方式
文章目录 前言 状态的编码方式 binary one-hot gray johnson auto compact sequential user speed none safe mode 前言 据我说 ...
- 彻底搞懂编码ASCII、Unicode、GBK 和 UTF8 、UTF-16、UTF-32编码方式(非常经典)
GBK,ISO-8859-1,GB2312的本质区别 编码有几种 ,计算机最初是在美国等国家发明的 所以表示字符只有简单的几个字母只要对字母进行编码就好 我们标准码 iso-8859-1 这就是一个标 ...
- 关于网页乱码和字符编码方式
网页出现乱码的原因一般是因为字符的编码方式不同. 字符编码是计算机技术的基础,对于计算机来说,所有的信息都是0或者1的二进制序列,计算机是无法直接识别和存储字符的,所以,字符必须经过编码才能被计算机处 ...
- 中文件编码方式_一文解开java中字符串编码的小秘密
简介:在本文中你将了解到Unicode和UTF-8,UTF-16,UTF-32的关系,同时你还会了解变种UTF-8,并且探讨一下UTF-8和变种UTF-8在java中的应用. Unicode的发展史 ...
- java ascii 编码方式,Java 字符编码 ASCII、Unicode和UTF-8
1 ASCII码 统一规定英语字符与二进制位之间的关系.ASCII码一共规定了128个字符的编码.例如,空格"SPACE"是32(二进制00100000),大写字母A是65(二进制 ...
最新文章
- Windows Server云服务器配置深度学习环境WS
- java intern_java String的intern方法
- np.random.randint产生一个范围内的数据
- mysql gui 有哪些_推荐五款较好的MySQLGUI工具
- Android开发指南中文版(十三)User Interface-Notifications
- unity如何得到所有子对象_Unity用户手册-Mesh合批
- Android 常用adb shell 命令(转)
- Eclipse配置优化
- 《非理性繁荣》读书笔记优秀作文5000字
- Strick mode 和Trace View使用
- 泰坦尼克号乘客生存情况分析之第二部分特征工程
- 校园网服务器系统方案设计,校园网服务器系统项目设计方案.pdf
- 做项目经理的自我总结(一)
- SAP中内部订单状态导致不能收货处理实例
- 计算机应用基础教学进度表,《计算机应用基础》教学计划及教学进度
- (20)全民小视频引流脚本模块化开发14-给脚本添加本地授权By飞云脚本学院
- F2FS--针对SSD的文件系统
- 安卓桌面壁纸_让安卓实现 “非线性” 动画壁纸,有iOS内味了
- 风水招财用品:貔貅的材质与区别
- MS-DOS安装过程
热门文章
- gbdt和xgboost中feature importance的获取
- HTMl5的存储方式sessionStorage和localStorage详解
- Android开机广播和关机广播
- VO,BO,PO,DO,DTO的区别
- HDFS查看文件的前几行-后几行-行数
- java的栈堆的理解_理解堆与栈 - 一步一个脚印 - BlogJava
- python hack库_常用的Python库
- Golang——流程控制语句、跳转控制语句细节
- flask登录验证用ajax,基于 Ajax 请求的 Flask-Login 认证
- php 查询键名是否存在,PHP array_key_exists():检测键名是否位于数组中