golang-标准库(encoding/hex)

encoding/hex包提供了十六进制转换的相关函数。

编码

先看函数:
1
2
3
4
func EncodedLen(n int) int // 计算长度为n的明文,编码后的长度
func Encode(dst, src []byte) int // 将src中的数据编码为16进制后存入dst中,返回实际写入的字节。
func EncodeToString(src []byte) string // 直接将src转换为16进制,返回字符串
func NewEncoder(w io.Writer) io.Writer // 返回一个io,向io写入的数据转换为16进制后写入w
下面看上面方法的代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"encoding/hex"
"fmt"
)

func main() {
src := []byte("abc123") // 准备数据
dst := make([]byte,hex.EncodedLen(len(src))) // 计算转换为16进制后的长度
hex.Encode(dst,src) // 转码
fmt.Printf("%s\n",dst) // 打印 616263313233,a的ascii码为97,97转换为16进制为61,后面的bc123同理

fmt.Println(hex.EncodeToString([]byte("abcdef"))) // 直接将byte切片转为字符串,打印 616263646566
}
当需要对大量流数据进行转码就需要用到NewEncoder函数,下面我们看代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"encoding/hex"
"os"
)

func main() {
wd,_ := os.Getwd() // 获取当前工作目录
file,_ := os.Create(wd+"/a.txt") // 创建目标文件
w := hex.NewEncoder(file) // 创建一个流io
w.Write([]byte("abc")) // 写入数据
w.Write([]byte("123")) // 写入数据
// 上面会将字符 abc123 转换为16进制后,写入到a.txt文件中
}
看结果:

解码

看完了编码再来看解码,解码函数与编码一样,只是过程相反而已,我们直接看代码示例:
1
2
3
4
5
6
7
8
9
10
11
func main() {
src := []byte("616263313233") // 准备数据
dst := make([]byte,hex.DecodedLen(len(src))) // 准备容器
hex.Decode(dst,src) // 解码
fmt.Printf("%s\n",dst) // 打印abc123

// 直接解码字符串
b,_ := hex.DecodeString("616263313233")
fmt.Printf("%s\n",b) // 打印abc123

}
同理,解码也有针对解码流数据的NewDecoder函数,与NewEncoder函数类似,只是后者先编码再写入,前者先读取后解码。

func NewDecoder(r io.Reader) io.Reader,这里不再演示。

作者

itpika

发布于

2019-07-04 10:00:42

更新于

2021-01-28 16:44:10

许可协议

评论