如何将[]字节转换为十六进制?

53

http://play.golang.org/p/SKtaPFtnKO

func md(str string) []byte {
    h := md5.New()
    io.WriteString(h, str)

    fmt.Printf("%x", h.Sum(nil))
    // base 16, with lower-case letters for a-f
    return h.Sum(nil)
}

我所需要的仅仅是从输入字符串转换而来的哈希密钥字符串。通过使用h.Sum(nil)方法,我已经能够以字节格式获得它并以%x格式打印出哈希密钥。但我想从这个函数中返回%x格式,这样我就可以将电子邮件地址转换为哈希密钥并用于访问Gravatar.com。

如何在Go中使用md5函数获取%x格式的哈希密钥?

谢谢,

2个回答

74

如果我理解正确,您想要返回%x格式:

您可以import "encoding/hex"并使用EncodeToString方法。

str := hex.EncodeToString(h.Sum(nil))

或者直接使用Sprintf格式化该值:

func md(str string) string {
    h := md5.New()
    io.WriteString(h, str)
    
    return fmt.Sprintf("%x", h.Sum(nil))
}

注意,Sprintf较慢,因为它需要解析格式字符串,然后根据找到的类型进行反射。

http://play.golang.org/p/vsFariAvKo


3
hex.EncodeToString(http://golang.org/pkg/encoding/hex/#EncodeToString)可能会更加高效(没有反射等)。 - Nick Craig-Wood
7
在我的基准测试中,hex.EncodeToStringfmt 快大约5倍。 - Eric Olson
也许只是我自己的问题,但 %x 命令输出为空,而 hex.EncodeToString 命令则有预期的输出。 - Daniel Williams
你可以导入十六进制。-- "你可以导入编码/十六进制" 会更好。 - jws

24
您应避免使用fmt包。 fmt包使用反射,除了调试之外的任何其他操作都会很昂贵。您知道自己有什么和要转换的内容,因此应使用适当的转换包。
要将二进制转换为十六进制并进行转换,请使用encoding/hex包。
转换为十六进制string:
str := hex.EncodeToString(h.Sum(nil))

从十六进制字符串

b, err := hex.DecodeString(str)

还有针对[]byte的编码/解码函数。

当您需要进行十进制转换时,请使用strconv包。

intstring

str := strconv.Itoa(100)

stringint

num, err := strconv.Atoi(str)

这个软件包中还有其他几个函数可以进行其他类型的转换(进制等)。

因此,除非您正在调试或格式化错误消息,请使用正确的转换方式。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接