encoding/hex.EncodeToString în Go

Scrie octeții în hexazecimal (două cifre 0-9a-f pe octet) și înapoi; forma obișnuită pentru hash-uri și chei.

Sintaxă
import "encoding/hex"

func EncodeToString(src []byte) string
func DecodeString(s string) ([]byte, error)

Ce face encoding/hex.EncodeToString

hex.EncodeToString(date) scrie fiecare octet ca două cifre hexazecimale cu litere mici: octetul 255 devine ff, iar textul „Go” devine 476f. Rezultatul are exact de două ori mai multe caractere decât octeți. Așa se afișează hash-urile SHA-256 și MD5, cheile, culorile și identificatorii.

hex.DecodeString(s) face drumul invers. Acceptă litere mari și mici și returnează eroare pentru caractere care nu sunt hexazecimale (hex.InvalidByteError) sau pentru un număr impar de caractere (hex.ErrLength).

Parametri

Parametru Descriere
src / s Octeții de codat sau textul hexazecimal de decodat.

Ce returnează

EncodeToString: textul hex. DecodeString: octeții și o eroare.

Exemple

Exemplul 1: Text și octeți în hexazecimal

package main

import (
	"encoding/hex"
	"fmt"
)

func main() {
	fmt.Println(hex.EncodeToString([]byte("Go")))
	fmt.Println(hex.EncodeToString([]byte("ș")), "(ș are 2 octeți în UTF-8)")
	fmt.Println(hex.EncodeToString([]byte{0, 15, 16, 255}))

	culoare, err := hex.DecodeString("1E90FF")
	fmt.Println("RGB:", culoare, err)

	_, err = hex.DecodeString("abc")
	fmt.Println("Lungime impară:", err)
	_, err = hex.DecodeString("zz")
	fmt.Println("Caracter invalid:", err)
}

Rezultat

476f
c899 (ș are 2 octeți în UTF-8)
000f10ff
RGB: [30 144 255] <nil>
Lungime impară: encoding/hex: odd length hex string
Caracter invalid: encoding/hex: invalid byte: U+007A 'z'

Exemplul 2: Hash afișat în hex

package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

func main() {
	suma := sha256.Sum256([]byte("dexblog.ro"))
	text := hex.EncodeToString(suma[:])
	fmt.Println(text)
	fmt.Println("La fel ca Sprintf cu x:", text == fmt.Sprintf("%x", suma))
}

Rezultat

166d3b7ccdd65543c2df9ef4036f11710cba10a6bc745ca0455c8494fedbbcf8
La fel ca Sprintf cu x: true

Greșeli frecvente

  • Dai lui EncodeToString un tablou ([32]byte) în loc de slice: nu compilează. Scrie suma[:].
  • Compari hash-uri hex scrise cu litere diferite (AB și ab) ca texte: nu sunt egale. Decodează-le sau adu-le la litere mici.

Comenzi înrudite

  • encoding/hex.Dump: Afișează octeții ca tabel: adresa, 16 octeți în hex pe rând și caracterele lor, ca hexdump -C.
  • crypto/sha256.Sum256: Calculează amprenta SHA-256 a unor date: 32 de octeți (64 de cifre hex) care se schimbă complet la orice modificare.
  • encoding/base64.Encoding: Codează octeți ca text Base64 (litere, cifre, +/ sau -_); StdEncoding, URLEncoding și variantele Raw fără „=”.