简析多种编码方式(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位二进制 = 0000‭0100 00001000 ‬0000‭0100 00000101‬ 0000‭0101 00001000
* 新的6个8位二进制 进行16进制转换 0000‭0100 00001000 ‬0000‭0100 00000101‬ 0000‭0101 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)相关推荐

  1. 记录几种常用编码方式:BASE64、MD5

    目录 1. BASE64 1.为什么要使用BASE64编码? 2. C语言实现 2. MD5 2.1. 主要特点 2.2. C语言实现 3. 1. BASE64 1.为什么要使用BASE64编码? 从 ...

  2. ASCII+Unicode+UTF8(字符编码方式-字节) Base64(字节编码方式-64字符)

    Base64 编码是一种可以把二进制文件编码成文本的编码规则.在很多地方地方都有用到,比如我们可以把图像转成 Base64 编码,然后内联到 HTML 或者 CSS 中. Base64 编码用一些很常 ...

  3. 315Mhz RF射频解码 串口输出方案(支持2262/1527多种编码方式)

    315Mhz RF射频解码 串口输出方案 一.简介 二.使用前准备 三.测试方法 四.测试现象 总结 原文链接:https://www.yourcee.com/newsinfo/2929023.htm ...

  4. [基因遗传算法]进阶之二:最优规划问题--多种编码方式+多变量

    参考资料: <遗传算法求解带约束优化问题(源码实现> <有约束的遗传算法(Python代码实现)> <遗传算法原理及其python实现> 同系列文章: <[基 ...

  5. FPGA之道(56)状态的编码方式

    文章目录 前言 状态的编码方式 binary one-hot gray johnson auto compact sequential user speed none safe mode 前言 据我说 ...

  6. 彻底搞懂编码ASCII、Unicode、GBK 和 UTF8 、UTF-16、UTF-32编码方式(非常经典)

    GBK,ISO-8859-1,GB2312的本质区别 编码有几种 ,计算机最初是在美国等国家发明的 所以表示字符只有简单的几个字母只要对字母进行编码就好 我们标准码 iso-8859-1 这就是一个标 ...

  7. 关于网页乱码和字符编码方式

    网页出现乱码的原因一般是因为字符的编码方式不同. 字符编码是计算机技术的基础,对于计算机来说,所有的信息都是0或者1的二进制序列,计算机是无法直接识别和存储字符的,所以,字符必须经过编码才能被计算机处 ...

  8. 中文件编码方式_一文解开java中字符串编码的小秘密

    简介:在本文中你将了解到Unicode和UTF-8,UTF-16,UTF-32的关系,同时你还会了解变种UTF-8,并且探讨一下UTF-8和变种UTF-8在java中的应用. Unicode的发展史 ...

  9. java ascii 编码方式,Java 字符编码 ASCII、Unicode和UTF-8

    1 ASCII码 统一规定英语字符与二进制位之间的关系.ASCII码一共规定了128个字符的编码.例如,空格"SPACE"是32(二进制00100000),大写字母A是65(二进制 ...

最新文章

  1. Windows Server云服务器配置深度学习环境WS
  2. java intern_java String的intern方法
  3. np.random.randint产生一个范围内的数据
  4. mysql gui 有哪些_推荐五款较好的MySQLGUI工具
  5. Android开发指南中文版(十三)User Interface-Notifications
  6. unity如何得到所有子对象_Unity用户手册-Mesh合批
  7. Android 常用adb shell 命令(转)
  8. Eclipse配置优化
  9. 《非理性繁荣》读书笔记优秀作文5000字
  10. Strick mode 和Trace View使用
  11. 泰坦尼克号乘客生存情况分析之第二部分特征工程
  12. 校园网服务器系统方案设计,校园网服务器系统项目设计方案.pdf
  13. 做项目经理的自我总结(一)
  14. SAP中内部订单状态导致不能收货处理实例
  15. 计算机应用基础教学进度表,《计算机应用基础》教学计划及教学进度
  16. (20)全民小视频引流脚本模块化开发14-给脚本添加本地授权By飞云脚本学院
  17. F2FS--针对SSD的文件系统
  18. 安卓桌面壁纸_让安卓实现 “非线性” 动画壁纸,有iOS内味了
  19. 风水招财用品:貔貅的材质与区别
  20. MS-DOS安装过程

热门文章

  1. gbdt和xgboost中feature importance的获取
  2. HTMl5的存储方式sessionStorage和localStorage详解
  3. Android开机广播和关机广播
  4. VO,BO,PO,DO,DTO的区别
  5. HDFS查看文件的前几行-后几行-行数
  6. java的栈堆的理解_理解堆与栈 - 一步一个脚印 - BlogJava
  7. python hack库_常用的Python库
  8. Golang——流程控制语句、跳转控制语句细节
  9. flask登录验证用ajax,基于 Ajax 请求的 Flask-Login 认证
  10. php 查询键名是否存在,PHP array_key_exists():检测键名是否位于数组中