hex编码,⽤途是什么,为什么需要hex编码呢?
hex编码,意义是什么呢?
formats an integer as a decimal string. Example: strconv.Itoa(65) and strconv.Itoa('A') return the string "65".
yields a string containing the UTF-8 representation of the integer. Example: string('A') and string(65) evaluate to the string "A".
Experience has shown that many people erroneously expect string(intValue) to return the decimal representation of the integer value. Because this expectation is so common, the Go 1.15 version of go vet warns about string(intValue) conversions when the type of the integer value is not rune or byte (read details ).
fmt.Println(string([]byte{231,149,140}))
上⾯这⾏,输出的是:界这个字符串  string(intvalue) yields a string containing the utf-8 representation of the integer.
fmt.Println([]byte(string(-1)))          // 输出: [239 191 189]
package main
字符串转数组编码方式import (
"encoding/hex"
"fmt"
)
func main() {
msg := []byte("Hello 世界")
encoded := hex.EncodeToString(msg)
fmt.Println(encoded)
// 48656c6c6f20e4b896e7958c
//encoded = "4769676162697445746865726E6574302F302F323400"
decoded, _ := hex.DecodeString(encoded)
fmt.Println(decoded)
// Hello 世界
fmt.Println(hex.EncodeToString([]byte{231,149,140}))
fmt.Println(hex.EncodeToString([]byte("界")))
}
----------------------------------------------------------
在开发加密解密数据的时候碰到需要把加密好的 byte 数组转换成 String 对象⽤于⽹络传输的需求,如果把字节数组直接转换成 UTF-8 等编码⽅式的话肯定会存在某些编码没有对应的字符,在传输过程中会遗漏数据。这时就可以通过常⽤的⼆进制数据编码⽅式 Base64 编码或者Hex 编码来实现。
Hex编码
因为⼀个字节中存在8个 bit可以表⽰256个字符,⽽ ASCII 码只能表⽰0-127种字符,为了能完整地表⽰
⼀个字节,可以将⼆进制数据转换为⼗六进制数据的⽅式来实现。所以 Hex 编码也被称作为 Base16 编码,相⽐于原先8位表⽰⼀个字节,Hex 编码能够只⽤2位表⽰⼀个字节。Hex 编码最常⽤于⼆进制⽂件查看时展⽰的编码,如 Hex Fiend 就可以⽀持查看⼆进制⽂件。
Base64编码
Base64编码是通过64个字符来表⽰⼆进制数据,64个字符表⽰⼆进制数据只能表⽰6位,所以他可以通过4个 Base64 的字符来表⽰3个字
节,如下是 Base64 的字符编码表
举个 Base64 编码的例⼦,如要表⽰字符串 Man ,先将各个字符转换为⼆进制形式,也就是 01001101 01100001 01101110,再以6位为单位进⾏分割,如果表⽰的字符串长度不为3的倍数,也就是存在缺位时则以0填充。得到各个部分的⼗进制表⽰为19,22,5,46,依照这个索引可以得出对应的 Base64 字符,为T,W,F,u。
像下⾯字符串长度不为3的倍数时,Base64编码会出现=。
Base64 编码使⽤4个字符便能表⽰3个字节,也就是会冗余出1/3的长度,不过其作为压缩⽐较⾼以及简单的编码⽅式能够⼴泛运⽤于⽹络传播的密钥⽂件等的编码,有时甚⾄可以直接来表⽰⼩的图⽚,⾳频
⽂件。Base64常被误⽤于数据加密,其实只要看到数据末尾是否有=符号就能判别是否使⽤了 Base64 加密便破解出来。只有不能被快速计算破解出来的数据加密⽅式才是严格意义上的加密。
______________________________________________________
package main
import (
"encoding/hex"
"fmt"
)
func main() {
msg := []byte("Hello 世界")
encoded := hex.EncodeToString(msg)
fmt.Println(encoded)
// 48656c6c6f20e4b896e7958c
//encoded = "4769676162697445746865726E6574302F302F323400"
decoded, _ := hex.DecodeString(encoded)
fmt.Println(string(decoded))
// Hello 世界
}
  -------------------------------------------------------------
前⾔:
  ⽹络上⼤多精彩的回答,该随笔⽤作⾃我总结;
  ⾸先计算机只认得⼆进制,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是国际组织制定的可以容纳世界上所有⽂字和符号的字符编码⽅案。⽬前的Unicode字符分为17组编排,0x0000 ⾄
0x10FFFF,每组称为平⾯(Plane),⽽每平⾯拥有65536个码位,共1114112个,但是码表和字符串的映射可以⽤数字表⽰,⾼位填0,但编码的⽅案确实可以多种的,例如如果码数1,⽤2字节就是:0x0001,需要传输2字节;但有必要吗?明显是没必要的!
  重复⼀遍,字符是独⼀⽆⼆的,⼈类符号系统抽象的产物,世界唯⼀,全世界的字符构成字符集,字符也是在演进的;⽽Unicode和GBK等都是字符的⼀种编码;也就是⼀个⼆进制⽐特串(数字)和字符的映射表;
⾯向字符、⾯向字节:
  对于⼀个抽象字符,在Java中的⼆进制表⽰当然需要编码,⽤的就是Unicode,如果源⽂件存储并⾮Unicode怎么办呢?当然需要转换,因此Java很多⾯向字符流的I/O其实都是默认有转换规则存在;
  这⾥提下I/O都分⾯向字节和字符,其实⾯向字节就是不管编码,⽽⾯向字符是带编码转换,是的⼀个抽象字符串如 “饭” 是在哪种编码格式都表⽰ “饭”,因此⾯向字符I/O指定编码格式很重要,⼀般不指定采⽤默认,如win操作系统默认GBK,⽽linux默认UTF-8;
UTF-8是编码规则 — 哈夫曼编码:
  Unicode是国际组织制定的可以容纳世界上所有⽂字和符号的字符编码⽅案。⽬前的Unicode字符分为17组编排,0x0000 ⾄
0x10FFFF,每组称为平⾯(Plane),⽽每平⾯拥有65536个码位,共1114112个,谨记;
  所以我们上⾯提到了,其实0x0001是没有必要⽤2个字节表⽰的,其实我⽤⼀个字节也可以的,那么什么情况下可以做到,在读⼀个2个字节表⽰的字符时候,我就读⽐特串中的2个字节位呢;所以⽐特串中,就需要有前⼏位代表,到底需要读⼏位;
  哈夫曼编码转换的
    Unicode
  UTF-8
  范围:0000 - 007F  前缀:0xxxxxxx
  范围:0080 - 07FF  前缀:110xxxxx 10xxxxxx
  范围:0800 - FFFF  前缀:1110xxxx 10xxxxxx 10xxxxx
  所以UTF-16也是⼀种编码规则,他们各⾃有各⾃的好处,主要体现在空间的节省上,如果⽂档的⼤部分字符串都是英⽂,那么⽤UTF-8会⽐较好,⽽如果⼤部分都是中⽂,则UTF-16会更节省空间。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。