详解go的hex.Encode原理

news2024/11/26 2:33:26

简言

今天看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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Idea项目初始化配置

Idea项目初始化配置 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助请帮我…

Node.js: express + MySQL实现修改密码

实现修改密码&#xff0c;本篇文章实现修改密码只考虑以下几个方面&#xff1a; &#xff08;1&#xff09;&#xff0c;获取旧密码 &#xff08;2&#xff09;&#xff0c;获取新密码 &#xff08;3&#xff09;&#xff0c;将获取到的旧密码与数据库中的密码进行比对&#xf…

IC 后端 corner 介绍

在数字IC后端&#xff0c;有对晶体管的偏差建模的PVT corner&#xff0c;以及对互连线偏差建模的RC corner。 芯片的延迟一般受到三个因素的影响&#xff1a;工艺&#xff08;Process&#xff09;、电压&#xff08;Voltage&#xff09;、温度&#xff08;Temperature&#xff…

rabbitmq是什么?rabbitmq安装、原理、部署

rabbitmq是什么&#xff1f; MQ的全称是Messagee Queue&#xff0c;因为消息的队列是队列&#xff0c;所以遵循FIFO 先进先出的原则是上下游传递信息的跨过程通信机制。 RabbitMQ是一套开源&#xff08;MPL&#xff09;新闻队列服务软件由 LShift 提供的一个 Advanced Messag…

linux学成之路(基础篇)(二十一)nfs服务器

前言 NFS是Network File System的缩写&#xff0c;它是一种在计算机网络中共享文件和文件系统的协议。NFS允许不同的计算机系统之间通过网络访问、读取和写入远程文件&#xff0c;就像访问本地文件一样。它是一种基于客户端-服务器体系结构的协议&#xff0c;其中一个计算机充当…

Python(三十五)pass语句

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

excel中的vlookup如何实现根据多个条件查找?

目录 简述问题公式思路通用公式三条件查找公式实例 简述 Excel 中根据一个条件查找非常方便&#xff0c;Excel 提供了内置函数 VLOOKUP。但是实际中往往有多种情形&#xff0c;需要根据多个条件进行查找操作&#xff0c;目前没有现成的内置函数。 本篇介绍 VLOOKPCHOOSE 组合…

SpringBoot读取配置的几种方式

SpringBoot读取配置的方式有多种&#xff0c;这里介绍6种 1.第一种Value 注意&#xff1a;static和final修饰的变量不生效 2.通过ConfigurationProperties&#xff08;prefix“”&#xff09; 适用于对对象多个变量统一绑定&#xff0c;比Value高效 3.通过Environment Sprin…

信创环境下,使用国产服务器如何进行文件高速可靠传输?

信创&#xff0c;即信息技术应用创新&#xff0c;2018年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;国家将信创产业纳入国家战略&#xff0c;并提出了“28n”发展体系。从产业链角度&#xff0c;信创产业生态体系较为庞大&#xff0c;主要包括基础硬件、基础软件、应…

堆和栈的区别以及栈的顺序存储和链式存储—Python数据结构(三)

栈 一、栈 1. 定义 栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)&#xff0c; 允许进行操作的一端称为”栈顶“&#xff0c;另一固定端称为”栈底“&#xff0c;当栈中没有元素时称为”空栈“。 2. 特点 栈只能在一端进行操作。 栈模型具有先进后出&#xff…

基于jeecg-boot的任务甘特图显示

更多功能看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 基于项目的任务显…

Redis项目 PART1

第一部分&#xff1a;含注册登入商户查询&#xff08;使用缓存) 一、注册登入 1.1 session共享问题 使用redis而不用传统的session的原因&#xff08;session共享问题&#xff09;&#xff1a;每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat&#x…

网络子系统学习3:网络访问层

目录 网络访问层 网络设备的表示 数据结构 注册网络设备 接收分组 传统方法 对高速接口的支持 发送分组 网络访问层 网络实现的第一层&#xff0c;即网络访问层。该层主要负责在计算机之间传输信息&#xff0c;与网卡的设备驱动程序直接协作。 本次不会讲驱动程序的设计…

全面助力AI人工智能在科研、教学与实践技能

目录 模块一 编程入门与进阶提高 模块二 科研数据可视化 模块三 信息检索与常用科研工具 模块四 科技论文写作与技巧 模块五 数据预处理与特征工程 模块六 多元线性回归 模块七 机器学习 模块八 深度学习 模块九 答疑讨论 更多推荐 在人工智能领域进行研究和深耕&…

PCB封装设计指导(十二)画出器件禁布,过孔走线禁布

PCB封装设计指导(十二)画出器件禁布,过孔走线禁布 对于分离器件或者Datasheet中有标注出走线或者过孔禁布,在封装中需要把这些信息体现出来,如何添加,见如下说明 1. 一般来讲,只有分离器件,比如电阻,电容,晶振才会在中间加上route keepout 和via keepout Via keep o…

Qt与opencv学习记录2

我希望把这篇文章中的效果实现。 【Qt学习】 OpenCV美图特效_qt图像处理_顾城沐心的博客-CSDN博客 问题1&#xff1a; 我发现是因为我使用的是MSVC2017 32位套件&#xff0c;改为MSVC2017 64位套件debug就好了。 感觉这是因为我选用的lib库也是64位的。 E:\opencv454\opencv…

使用STM32 再实现PWM小车两轮分别调速

关于PWM调速的原理&#xff0c;其实在之前89C52开发小车的时候也已经详细的描述过&#xff0c;所以主要的区别还是STM32和89C52的PWM实现区别。 关于STM32的PWM实现&#xff0c;是从CubeMX的配置开始的&#xff1a; CubeMX 1. 在上节的CubeMX项目基础上进行修改 2. 两路PWM分…

2023牛客暑期多校训练营2

题目顺序不分难度 KBox 状态dp&#xff0c;因为每个棋子只能移动到 i-1 到 i1的位置&#xff0c;所以直接用4个状态表示棋子在哪 f[i][0] 表示前i个位置中&#xff0c;i-1到i1都没有棋子 f[i][1] 表示前i个位置中&#xff0c;i-1有棋子 f[i][2] 表示前i个位置中&#xff0…

Autosar - PDUR简介与配置

文章目录 一、PDUR是什么二、不同报文类型的信号流ECUC(EcucPduCollection)三、时序图CanIfs之间的路由CanIf与Com之间的路由CanTp通道间的路由一、PDUR是什么 PDU Router(路由器)在本文将简称为PduR,在AUTOSAR的架构中,通信部份中很重要的一个模块就是PduR,它能将IPdu…

C++: day6

1 思维导图 2 顺序栈模板和顺序队列模板 #include <iostream>using namespace std;template <typename T> class My_stack { private:T *ptr; //指向堆区空间int top; //记录栈顶元素public://无参构造My_stack():ptr(new T[10]), top(-1){}//有参构造My_sta…