Как перейти из [] байтов, чтобы получить шестнадцатеричный

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

Мне нужна строка Hash-key, которая преобразуется из входной строки. Я смог получить его в формате байтов, используя h.Sum(nil) и смог распечатать хэш-ключ в формате% x. Но я хочу вернуть формат% x из этой функции, чтобы я мог использовать его для преобразования адреса электронной почты в Hash-key и использовать его для доступа к Gravatar.com.

Как мне получить хэш-ключ% x с помощью функции md5 в Go?

Спасибо,

Ответы

Ответ 1

Если я правильно понял, вы хотите вернуть формат% x:

вы можете импортировать 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

Ответ 2

Вам следует избегать использования пакета fmt для этого. Пакет fmt использует отражение, и это дорого для чего угодно, кроме отладки. Вы знаете, что у вас есть, и для чего хотите конвертировать, поэтому вы должны использовать соответствующий пакет конверсий.

Для преобразования из двоичного в шестнадцатеричный и обратно используйте пакет encoding/hex.

В шестнадцатеричный string:

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

От Hex string:

b, err := hex.DecodeString(str)

Существуют также функции Encode/Decode для []byte.

Когда вам нужно преобразовать в/из десятичного числа, используйте пакет strconv.

От int до string:

str := strconv.Itoa(100)

От string до int:

num, err := strconv.Atoi(str)

В этом пакете есть несколько других функций, которые выполняют другие преобразования (база и т.д.).

Поэтому, если вы не отлаживаете или не форматируете сообщение об ошибке, используйте правильные преобразования. Пожалуйста.