понедельник, 29 июня 2020 г.

Пакет hex в Golang

Пакет hex реализует шестнадцатеричное кодирование и декодирование.

Функция Decode

func Decode(dst, src []byte) (int, error)

Decode декодирует src в DecodedLen(len(src)) байты, возвращая фактическое количество байтов, записанных в dst.

Decode ожидает, что src содержит только шестнадцатеричные символы, а src имеет четную длину. Если входные данные искажены, Decode возвращает количество байтов, декодированных до ошибки.

Пример использования hex.Decode

package main

import (
    "encoding/hex"
    "fmt"
    "log"
)

func main() {
    src := []byte("48656c6c6f20476f7068657221")

    dst := make([]byte, hex.DecodedLen(len(src)))
    n, err := hex.Decode(dst, src)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s\n", dst[:n])

}

Вывод:

Hello Gopher!

Функция DecodeString

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

DecodeString возвращает байты, представленные шестнадцатеричной строкой s.

DecodeString ожидает, что src содержит только шестнадцатеричные символы и что src имеет четную длину. Если входные данные искажены, DecodeString возвращает байты, декодированные до ошибки.

Пример использования hex.DecodeString

package main

import (
    "encoding/hex"
    "fmt"
    "log"
)

func main() {
    const s = "48656c6c6f20476f7068657221"
    decoded, err := hex.DecodeString(s)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s\n", decoded)

}

Вывод:

Hello Gopher!

Функция Encode

func Encode(dst, src []byte) int

Encode кодирует src в EncodedLen(len(src)) байты dst. Для удобства он возвращает количество байтов, записанных в dst, но это значение всегда EncodedLen(len(src)). Кодирование реализует шестнадцатеричное кодирование.

Пример использования hex.Encode

package main

import (
    "encoding/hex"
    "fmt"
)

func main() {
    src := []byte("Hello Gopher!")

    dst := make([]byte, hex.EncodedLen(len(src)))
    hex.Encode(dst, src)

    fmt.Printf("%s\n", dst)

}

Вывод:

48656c6c6f20476f7068657221

Функция EncodeToString

func EncodeToString(src []byte) string

EncodeToString возвращает шестнадцатеричное кодирование src.

Пример использования hex.EncodeToString

package main

import (
    "encoding/hex"
    "fmt"
)

func main() {
    src := []byte("Hello")
    encodedStr := hex.EncodeToString(src)

    fmt.Printf("%s\n", encodedStr)

}

Вывод:

48656c6c6f

Функция Dump

func Dump(data []byte) string

Dump возвращает строку, содержащую шестнадцатеричный дамп данных. Формат шестнадцатеричного дампа совпадает с выводом `hexdump -C` в командной строке.

Пример использования hex.Dump

package main

import (
    "encoding/hex"
    "fmt"
)

func main() {
    content := []byte("Go is an open source programming language.")

    fmt.Printf("%s", hex.Dump(content))

}

Вывод:

00000000  47 6f 20 69 73 20 61 6e  20 6f 70 65 6e 20 73 6f  |Go is an open so|
00000010  75 72 63 65 20 70 72 6f  67 72 61 6d 6d 69 6e 67  |urce programming|
00000020  20 6c 61 6e 67 75 61 67  65 2e                    | language.|

Функция Dumper

func Dumper(w io.Writer) io.WriteCloser

Dumper возвращает WriteCloser, который записывает шестнадцатеричный дамп всех записанных данных в w. Формат дампа соответствует выводу `hexdump -C` в командной строке.

Пример использования hex.Dumper

package main

import (
    "encoding/hex"
    "os"
)

func main() {
    lines := []string{
        "Go is an open source programming language.",
        "\n",
        "We encourage all Go users to subscribe to golang-announce.",
    }

    stdoutDumper := hex.Dumper(os.Stdout)

    defer stdoutDumper.Close()

    for _, line := range lines {
        stdoutDumper.Write([]byte(line))
    }

}

Вывод:

00000000  47 6f 20 69 73 20 61 6e  20 6f 70 65 6e 20 73 6f  |Go is an open so|
00000010  75 72 63 65 20 70 72 6f  67 72 61 6d 6d 69 6e 67  |urce programming|
00000020  20 6c 61 6e 67 75 61 67  65 2e 0a 57 65 20 65 6e  | language..We en|
00000030  63 6f 75 72 61 67 65 20  61 6c 6c 20 47 6f 20 75  |courage all Go u|
00000040  73 65 72 73 20 74 6f 20  73 75 62 73 63 72 69 62  |sers to subscrib|
00000050  65 20 74 6f 20 67 6f 6c  61 6e 67 2d 61 6e 6e 6f  |e to golang-anno|
00000060  75 6e 63 65 2e                                    |unce.|


Читайте также:


Комментариев нет:

Отправить комментарий