Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

go


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

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

like image 799
Андрей Антонов Avatar asked Nov 24 '25 13:11

Андрей Антонов


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

like image 149
masnun Avatar answered Nov 27 '25 03:11

masnun


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.


Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!