如何将 []byte 转换为C hex格式0x...?

3

func main() {
    str := hex.EncodeToString([]byte("go"))
    fmt.Println(str)
}

这段代码返回 676f。如何以 C 语言风格打印出 0x67, 0x6f ?

2个回答

2

我在hex模块中没有找到能够实现你想要的功能的任何函数。但是,我们可以使用自定义缓冲区以我们想要的格式进行编写。

package main

import (
    "bytes"
    "fmt"
)

func main() {
    originalBytes := []byte("go")

    result := make([]byte, 4*len(originalBytes))

    buff := bytes.NewBuffer(result)

    for _, b := range originalBytes {
        fmt.Fprintf(buff, "0x%02x ", b)
    }

    fmt.Println(buff.String())

}

可运行的示例:https://goplay.space/#fyhDJ094GgZ


1
这里有一个解决方案,它可以按照问题中指定的方式生成结果。具体来说,在每个字节之间有一个", ",没有尾随空格。
p := []byte("go")

var buf strings.Builder
if len(p) > 0 {
    buf.Grow(len(p)*6 - 2)
    for i, b := range p {
        if i > 0 {
            buf.WriteString(", ")
        }
        fmt.Fprintf(&buf, "0x%02x", b)
    }
}
result := buf.String()

strings.Builder类型用于避免在最终转换为字符串时分配内存。另一个答案使用的bytes.Buffer会在此步骤中分配内存。

初始时,构建器的大小足够大,以容纳每个字节和分隔符的表示形式。另一个答案忽略了分隔符的大小。

在 Go playground 上试一试


感谢您的细致回答,我喜欢您的方法。 - masnun
1
strings.Builder和bytes.Buffer的区别是微妙的。其他所有内容都与正确性有关。 - user12206905

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