概要
たまに使いたいときによく忘れているので、ここにメモメモ。。。
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
参考情報
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場