How to convert []byte to C hex format 0x...?

Viewed 950

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

this code return 676f. How I can print C-like 0x67, 0x6f ?

2 Answers

I couldn't find any function in the hex module that would achieve what you want. However, we can use a custom buffer to write in our desired format.

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())

}

Runnable example: https://goplay.space/#fyhDJ094GgZ

Here's a solution that produces the result as specified in the question. Specifically, there's a ", " between each byte and no trailing space.

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()

The strings.Builder type is used to avoid allocating memory on the final conversion to a string. Another answer uses bytes.Buffer that does allocate memory at this step.

The the builder is initially sized large enough to hold the representation of each byte and the separators. Another answer ignores the size of the separators.

Try this on the Go playground.

Related