商贸公司的网站建设,网络技术专业就业方向,建立网站的技术路径,网站建设时间规划表简言
今天看nsq的messageID生成的时候#xff0c;发现它使用了hex.Encode函数来产生编码#xff0c;那就顺道研究一下这个编码方式。
原理
hex是16进制的意思#xff0c;encode是进行编码的意思#xff0c;内部实现也很简单#xff0c;就是
每4位计算出十六进制的值发现它使用了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/hexfmt
)
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