いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-172 (encoding/hexパッケージ)

概要

たまに使いたいときによく忘れているので、ここにメモメモ。。。

encoding/hex パッケージは HEX (16進数) 関連の操作が出来るパッケージで、何気に結構便利です。

通信処理とか書いたりしているときなどに重宝します。

以下、自分用のメモです。

エンコード

package hexop

import (
    "encoding/hex"

    "github.com/devlights/gomy/output"
)

// Encode -- encoding/hex.Encode を利用したサンプルです.
//
// REFERENCES
//   - https://pkg.go.dev/encoding/hex@go1.17.6
func Encode() error {
    // Go では 何かのデータ を変換する際は基本 []byte でやり取りする
    // エンコードとは、元のデータを16進数に変換すること

    var (
        src    = []byte("hello world")
        encLen = hex.EncodedLen(len(src))
        dst    = make([]byte, encLen)
    )

    hex.Encode(dst, src)

    output.Stdoutl("original", string(src))
    output.Stdoutl("enc-len ", encLen)
    output.Stdoutl("encoded ", string(dst))

    return nil
}

実行すると以下のようになります。

gitpod /workspace/try-golang $ make run
go run github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: hexop_encode

[Name] "hexop_encode"
original             hello world
enc-len              22
encoded              68656c6c6f20776f726c64


[Elapsed] 20.449µs

デコード

package hexop

import (
    "encoding/hex"

    "github.com/devlights/gomy/output"
)

// Decode -- encoding/hex.Decode を利用したサンプルです.
//
// REFERENCES
//   - https://pkg.go.dev/encoding/hex@go1.17.6
func Decode() error {
    // Go では 何かのデータ を変換する際は基本 []byte でやり取りする
    // デコードとは、16進数データを元のデータに戻すこと

    var (
        src    = []byte("68656c6c6f20776f726c64")
        decLen = hex.DecodedLen(len(src))
        dst    = make([]byte, decLen)
    )

    hex.Decode(dst, src)

    output.Stdoutl("original", string(src))
    output.Stdoutl("dec-len ", decLen)
    output.Stdoutl("decoded ", string(dst))

    return nil
}

実行すると以下のようになります。

gitpod /workspace/try-golang $ make run
go run github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: hexop_decode

[Name] "hexop_decode"
original             68656c6c6f20776f726c64
dec-len              11
decoded              hello world


[Elapsed] 19.221µs

エンコーダー

package hexop

import (
    "bytes"
    "encoding/hex"

    "github.com/devlights/gomy/output"
)

// Encoder -- encoding/hex.NewEncoder を利用したサンプルです.
//
// REFERENCES
//   - https://pkg.go.dev/encoding/hex@go1.17.6
func Encoder() error {
    var (
        buf = &bytes.Buffer{}
        enc = hex.NewEncoder(buf)
        src = []byte("hello world")
    )

    if _, err := enc.Write(src); err != nil {
        return err
    }

    output.Stdoutl("original", string(src))
    output.Stdoutl("encoded ", buf.String())

    return nil
}

実行すると以下のようになります。

gitpod /workspace/try-golang $ make run
go run github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: hexop_encoder

[Name] "hexop_encoder"
original             hello world
encoded              68656c6c6f20776f726c64


[Elapsed] 16.698µs

デコーダー

package hexop

import (
    "bytes"
    "encoding/hex"

    "github.com/devlights/gomy/output"
)

func Decoder() error {
    var (
        src = "68656c6c6f20776f726c64"
        buf = bytes.NewBufferString(src)
        dec = hex.NewDecoder(buf)
        dst = make([]byte, hex.DecodedLen(buf.Len()))
    )

    if _, err := dec.Read(dst); err != nil {
        return err
    }

    output.Stdoutl("original", src)
    output.Stdoutl("decoded ", string(dst))

    return nil
}

実行すると以下のようになります。

gitpod /workspace/try-golang $ make run
go run github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: hexop_decoder

[Name] "hexop_decoder"
original             68656c6c6f20776f726c64
decoded              hello world


[Elapsed] 15.373µs

ダンプ

package hexop

import (
    "encoding/hex"
    "io"
    "os"
    "strings"
)

// Dumper -- encoding/hex.Dumper のサンプルです。
func Dumper() error {
    // -----------------------------------------------------
    // encoding/hex#Dumper を利用すると hexdump コマンドを
    // 実行した場合のような16進数ダンプを出力することができる.
    //
    // hex.Dumper は、io.Writer を受け取り、io.WriteCloserを返す.
    //
    // 最後に Close を呼ばないと、ダンプ出力の右側に元の値が表示されないので注意
    // (Close を呼ばないままだと、16進部分のみが出力される)
    // -----------------------------------------------------
 
    var (
        reader = strings.NewReader("hello world")
        writer = os.Stdout
        dumper = hex.Dumper(writer)
    )
    defer dumper.Close() // Close を呼ぶことにより、出力の右側に値が出力される

    if _, err := io.Copy(dumper, reader); err != nil {
        return err
    }

    return nil
}

実行すると以下のようになります。

gitpod /workspace/try-golang $ make run
go run github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: hexop_dumper

[Name] "hexop_dumper"
00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64                 |hello world|


[Elapsed] 26.66µs

参考情報


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com