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

 更新时间:2026年06月22日 10:31:32   作者: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个字节的方式,相比原来,编码结果是翻倍

举例:

  • 原本有1个字节的内容是 00010111,现在进行hex.Encode操作
  • 先把前面的0001计算出十六进制,也就是1,字符1对应的ASCII码表中是0011 0001
  • 再把后面的0111计算出十六进制,也就是7,字符7对应的ASCII码表中是0011 0111
  • 一通操作下来,原来一个字节就变成了两个字节

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,转换过程如下

  • 高4位的0000计算出十六进制的值,也就是0,在ASCII码表中字符0对应48
  • 低4位的0001计算出十六进制的值,也就是1,在ASCII码表中字符1对应49

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

  • 高4位的0000计算出十六进制的值,也就是0,在ASCII码表中字符0对应48
  • 低4位的1011计算出十六进制的值,也就是b,在ASCII码表中字符b对应98

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

  • 高4位的1110计算出十六进制的值,也就是e,在ASCII码表中字符e对应101
  • 低4位的0010计算出十六进制的值,也就是2,在ASCII码表中字符2对应50

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

  • 高4位的0100计算出十六进制的值,也就是4,在ASCII码表中字符4对应52
  • 低4位的1000计算出十六进制的值,也就是8,在ASCII码表中字符8对应56

总结

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

相关文章

  • golang常用库之pkg/errors包第三方错误处理包案例详解

    golang常用库之pkg/errors包第三方错误处理包案例详解

    这篇文章主要介绍了golang常用库之pkg/errors包第三方错误处理包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 一文教你如何在Golang中用好泛型

    一文教你如何在Golang中用好泛型

    golang的泛型已经出来了一年多了,从提案被接受开始我就在关注泛型了,好用是好用,但问题也很多,所以本文就来教大家如何在Golang中用好泛型吧
    2023-07-07
  • golang生成RSA公钥和密钥的实现方法

    golang生成RSA公钥和密钥的实现方法

    本文主要介绍了golang生成RSA公钥和密钥的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • 详解Golang中的各种时间操作

    详解Golang中的各种时间操作

    这篇文章主要介绍了详解Golang中的各种时间操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Go 语言中运行 C程序 代码 

    Go 语言中运行 C程序 代码 

    这篇文章主要介绍了Go 语言中运行 C程序代码,通过直接在 Go 代码中写入 C 程序运行,下面操作过程需要的小伙伴可以参考一下
    2022-03-03
  • Go defer 原理和源码剖析(推荐)

    Go defer 原理和源码剖析(推荐)

    这篇文章主要介绍了Go defer 原理和源码剖析,需要的朋友可以参考下
    2021-11-11
  • Go语言中的init函数特点及用法详解

    Go语言中的init函数特点及用法详解

    在Go语言中,init()函数是一种特殊的函数,用于在程序启动时自动执行一次。它的存在为我们提供了一种机制,可以在程序启动时进行一些必要的初始化操作,为程序的正常运行做好准备,在这篇文章中,我们将详细探讨init()函数的特点、用途和注意事项
    2023-06-06
  • golang类型断言的实现示例

    golang类型断言的实现示例

    在Go语言中,类型断言用于从接口类型获取其具体类型的值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • wind10 idea中 go 开发环境搭建教程图解

    wind10 idea中 go 开发环境搭建教程图解

    这篇文章主要介绍了wind10 idea中 go 开发环境搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • golang中数组与切片的区别详析

    golang中数组与切片的区别详析

    数组是固定长度,常量,切片长度是可以改变,所以是一个可变的数组,下面这篇文章主要给大家介绍了关于golang中数组与切片区别的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论