web-dev-qa-db-ja.com

[]バイトから16進数を取得する方法

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

必要なのは、入力文字列から変換されたハッシュキー文字列です。 h.Sum(nil)を使用してバイト形式で取得し、%x形式でハッシュキーを出力できました。しかし、この関数から%x形式を返し、それを使用して電子メールアドレスをハッシュキーに変換し、それを使用してGravatar.comにアクセスできるようにします。

Goでmd5関数を使用して%x形式のハッシュキーを取得するにはどうすればよいですか?

ありがとう、

25
user2671513

私が正しく理解しているなら、あなたは%x形式を返したいです:

16進数をインポートして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

31
fabrizioM

これにはfmtパッケージを使用しないでください。 fmtパッケージはリフレクションを使用し、デバッグ以外には高価です。自分が何を持っているか、何に変換したいかを知っているので、適切な変換パッケージを使用する必要があります。

バイナリから16進数への変換、およびその逆の変換には、 encoding/hex パッケージを使用します。

16進数へstring

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

Hex stringから:

b, err := hex.DecodeString(str)

[]byteのエンコード/デコード関数もあります。

10進数から/に変換する必要がある場合は、 strconv パッケージを使用します。

intからstringへ:

str := strconv.Itoa(100)

stringからintへ:

num, err := strconv.Atoi(str)

このパッケージには、他の変換(ベースなど)を行う他の関数がいくつかあります。

したがって、エラーメッセージをデバッグまたはフォーマットしない限り、適切な変換を使用してください。お願いします。

15
Luke