如何从 []bytes 获取十六进制

问题描述 投票:0回答:3

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 格式的哈希键?

谢谢,

hash go gravatar
3个回答
78
投票

如果我理解正确,你想返回 %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


24
投票

您应该避免使用

fmt
包来实现此目的。
fmt
包使用反射,除了调试之外,它的成本很高。您知道自己拥有什么,以及想要转换成什么,所以您应该使用正确的转换包。

要从二进制转换为十六进制,然后再转换回来,请使用 encoding/hex 包。

转十六进制

string
:

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

来自十六进制

string

b, err := hex.DecodeString(str)

还有

[]byte
的编码/解码功能。

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

int
string

str := strconv.Itoa(100)

string
int

num, err := strconv.Atoi(str)

此包中还有其他几个函数可以执行其他转换(基数等)。

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


0
投票

所提供的一些解决方案在涉及的最大允许数量方面存在限制。

我已经阅读了 Luke 写的关于使用 fmt 包的内容,但我仍然喜欢在此页面添加替代解决方案,因为我没有看到任何人提供此特定方法,它实际上只有 3 行,我非常确定此解决方案将对于将来访问此页面的某些人也很有用。

package main

import(
    "fmt"
    "math/big"
)

func main() {

    newbytes := []byte{159,127,208,150,211,126,210,192,227,247,240,207,201,36,190,239,79,252,235,104}

    newkey := new(big.Int).SetBytes(newbytes)

    fmt.Printf("%X \n", newkey)
}

或者如果您只需要抓住绳子

package main

import(
    "fmt"
    "math/big"
)

func getHexString(bytesl []byte) (string) {

    newkey := new(big.Int).SetBytes(bytesl)

    base16str := fmt.Sprintf("%X",newkey)

    return base16str
}

func main() {

    newbytes := []byte{159,127,208,150,211,126,210,192,227,247,240,207,201,36,190,239,79,252,235,104}

    hexstr := getHexString(newbytes)

    fmt.Println(hexstr)
}

需要明确的是,我并不是说这是一个好的或最好的方法,因为这通常取决于项目环境,所以我只是为了完整性和演示目的而添加它。

© www.soinside.com 2019 - 2024. All rights reserved.