Как преобразовать байт [] в C шестнадцатеричный формат 0x ...? - PullRequest
2 голосов
/ 13 октября 2019

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

этот код возвращает 676f. Как я могу напечатать C-like 0x67, 0x6f?

Ответы [ 2 ]

2 голосов
/ 13 октября 2019

Я не смог найти ни одной функции в модуле 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 голос
/ 13 октября 2019

Вот решение, которое дает результат, указанный в вопросе. В частности, есть "," между каждым байтом и без пробела.

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...