Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go的hex.Encode原理

go的hex.Encode原理分析及解读

作者:YZF_Kevin

这段描述融合了hex编码和ASCII码两个关键词,详细解释了hex.Encode函数的工作原理,即如何将每个字节转换为两个十六进制字符,从而将原本的字节数组长度翻倍,通过具体的代码实例进一步说明了转换过程和最终结果

简言

今天看nsq的messageID生成的时候,发现它使用了hex.Encode函数来产生编码,那就顺道研究一下这个编码方式。

原理

hex是16进制的意思,encode是进行编码的意思,内部实现也很简单,就是

每4位计算出十六进制的值,因为4位二进制范围0000 ~ 1111,也就是在0~15之间,用16进制来表示即0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f    取这些字符对应的ASCII码的二进制即可

而且,大家如果按照16进制来显示这些转换后的字节数组,会发现范围都是在0~9 a~f

很明显这种把1个字节分两步,按照每4位来转换成1个字节,最终形成2个字节的方式,相比原来,编码结果是翻倍

举例:

hex.Encode就是遍历给定的字节数组,把每个字节都这样处理

我们再举个代码的例子(对4个字节进行Encode,会发现得到了8个字节)

package main
import (
	"encoding/hex"
	"fmt"
)
func main() {
	// 原来的字节数组,4字节
	src := []byte{1, 11, 226, 'H'}
	// 结果的字节数组,其实8字节就够,这里特意搞了10个字节,大家会发现后面两个字节没变
	dest := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

	hex.Encode(dest, src)
	for i := 0; i < len(dest); i++ {
		fmt.Printf("dest[%d]=%v \n", i, dest[i])
	}
}

运行结果如下图

先给大家贴出来ASCII码表

贴出来源字符串

src := []byte{1, 11, 226, 'H'}

解释下上面代码的转换过程

第一个字节,src中是1,二进0000 0001,转换过程如下

第二个字节,src中是11,二进制0000 1011,转换过程如下

第三个字节,src中是226,二进制1110 0010,转换过程如下

第四个字节,src中是'H',二进制0100 1000,转换过程如下

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文