前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟带你了解 Go 密码学编程之 Hex 编码!

3分钟带你了解 Go 密码学编程之 Hex 编码!

作者头像
小锟哥哥
发布2023-03-08 20:24:38
4540
发布2023-03-08 20:24:38
举报
文章被收录于专栏:GoLang全栈GoLang全栈

最近准备把常用的密码学相关的一些算法都过一遍,先从最简单的 Hex 编码开始吧!

在我自己学习的过程中,看过别人的文章,自己也看过源码,发现有些文章的介绍是有问题的。

所以我这里会讲的更细致一些,尽量通俗易懂,但我也不会像讲计算机基础那样,细枝末节的知识就略过了。

基础

计算机存储数据,大部分时候都是以字节为单位的,我们这里称为 1Byte。

但是实际上 1Byte 还可以分的更细,即分为 8 个 bit 位。

bit 位应该大家都熟悉了,1bit 只能存储 0 或者 1, 那么 8bit 能存储数据的范围就是 0000'0000~1111'1111 ,转换成 10 进制就是 0~255,至于是带不带符号,我们这里不关心的,因为编码的时候只管这 8bit 里的 2 进制值。

另外有个地方很多人会混淆的,就是 1Byte 存储数值和存储字符的时候,底层实际的值是不一样的(很多讲 Hex 的文章这一块都讲错了,这些文章没有把数值和字符做区分)。

比如存储数值 1 的时候,1Byte 中的 8 bit 值是 0000'0001,存储字符 "1" 的时候,1Byte 中的 8 bit 值是 0011'0001。

Hex 编码简介

Hex 编码是将数据转换成符合 Intel Hex 文件格式的一种编码方式。

Hex 编码的最小单位是 1Byte 也即 8 个 bit 位。

算法

  1. 将 1Byte 分成高 4bit 和低 4bit。
  2. 算出高 4bit 对应的 16 进制数值,这里记为数值 a。
  3. 找出这个数值 a 对应的字符 "a"。
  4. 找出这个字符 "a" 对应的 ascii 码,这个 ascii 码是 8bit 的,也即 1Byte。
  5. 通过相同的方法找出低 8bit 算出来的 ascii 码。
  6. 将上面算出来的 2 个 Byte 拼在一起就得到编码后的 2Byte 数据。

特点

  1. Hex 编码后的数据大小是原来的 2 倍。
  2. 由于算法内部是对 4bit 进行转换,所以编码后的数据从显示上来看是由 0~F 这 16 个字符组成。

我们来看两个例子:

  1. Byte 存储实际数值的情况 假定有 1Byte,里面存放的数值是十进制 226,那么它存储的 8 位二进制值是 1110'0010。高4位是 1110,低4位是 0010。

Hex编码的时候,先取高 4 位 1110 转成十六进制的 e ,然后去寻找字符 "e" 对应的 ascii 码,即为 0110'0101。再取低 4 位 0010 转成十六进制的 2 ,然后去寻找字符 "2" 对应的 ascii 码,即为 0011'0010。最终转换后的数据是 0110'0101 0011'0010。按照字符串显示就是 e2。

Go语言实现的代码如下:

代码语言:javascript
复制
package main

import (
    "encoding/hex"
    "fmt"
)

func main() {
    data := make([]byte, 1, 1)
    //这里 data 存放的是真实的数值  
    data[0] = 226
    fmt.Println(data)
    //调用 Go 自带的 hex 库来进行编码  
    res := hex.EncodeToString(data)
    fmt.Println(res)
}
  1. Byte 存储字符的情况 假定有 1Byte,里面存放的是字符 "g",那么它存储的 8 位二进制值是 0110'0111,高4位是 0110,低4位是 0111。

Hex编码的时候,先取高 4 位 0110 转成十六进制的 6 ,然后去寻找字符 "6" 对应的 ascii 码,即为 0011'0110,再取低 4 位 0111 转成十六进制的 7 ,然后去寻找字符 "7" 对应的 ascii 码,即为 0011'0111, 最终转换后的数据是 0011'0110 0011'0111,按照字符串显示就是 67。

Go语言实现的代码如下:

代码语言:javascript
复制
package main

import (
    "encoding/hex"
    "fmt"
)

func main() {
    data := make([]byte, 1, 1)
    //这里 data 存放的是字符
    data[0] = 'g'
    fmt.Println(data)
    //调用 Go 自带的 hex 库来进行编码  
    res := hex.EncodeToString(data)
    fmt.Println(res)
}

你学废了么?

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-16,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础
  • Hex 编码简介
  • 算法
  • 特点
  • 我们来看两个例子:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com