いろいろ備忘録日記

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

Goメモ-158 (base64 エンコードとデコード)

概要

たまに base64 でバイナリを送ったりすることがあるので、忘れないうちにここにメモメモ。

サンプル

エンコード

普通の文字列をBase64することは個人的にあまり無いので、適当なバイナリファイルとして Unsplash の画像を使わせてもらってます。

unsplash.com

package base64op

import (
    "bytes"
    "io"
    "net/http"
)

type (
    downloder string
)

func (me downloder) download() (*bytes.Buffer, error) {
    var (
        client http.Client
        resp   *http.Response
        buf    = new(bytes.Buffer)
        err    error
    )

    if resp, err = client.Get(string(me)); err != nil {
        return buf, err
    }
    defer resp.Body.Close()

    if _, err = io.Copy(buf, resp.Body); err != nil {
        return buf, err
    }

    return buf, nil
}
package base64op

import (
    "bytes"
    "encoding/base64"

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

// Encode -- base64.StdEncoding.Encode のサンプルです.
//
// REFERENCES:
//   - https://pkg.go.dev/encoding/base64
//   - https://pkg.go.dev/net/http
//   - https://gobyexample.com/base64-encoding
//   - https://golangdocs.com/base64-encoding-decoding-golang
//   - https://golangdocs.com/golang-download-files
//   - https://qiita.com/daijuk/items/d5c52b780e90387f2390
func Encode() error {
    const (
        imgUrl = "https://unsplash.com/photos/Cv96uQrD5HI/download?force=true"
    )

    var (
        dl  = downloder(imgUrl)
        buf *bytes.Buffer
        err error
    )

    if buf, err = dl.download(); err != nil {
        return err
    }
    output.Stdoutl("[original length      ]", buf.Len())

    var (
        src = buf.Bytes()
        dst = make([]byte, base64.StdEncoding.EncodedLen(len(src)))
    )

    base64.StdEncoding.Encode(dst, src)

    output.Stdoutl("[base64 encoded length]", len(dst))
    output.Stdoutl("[incremental rate     ]", float32(len(dst))/float32(len(src)))
    output.Stdoutl("[first 100 bytes      ]", string(dst[:99]))

    return nil
}
$ make run
go get -d ./...
go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: base64op_encode

[Name] "base64op_encode"
[original length      ] 906472
[base64 encoded length] 1208632
[incremental rate     ] 1.3333362
[first 100 bytes      ] /9j/4AAQSkZJRgABAQEASABIAAD/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADl


[Elapsed] 1.6437872s

Base64 の変換は、元のサイズより 133%から137% ほど大きくなるとなっています。結果を見ると大体そんな感じで増えていますね。

デコード

package base64op

import (
    "bytes"
    "encoding/base64"

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

// Decode -- base64.StdEncoding.Decode のサンプルです.
//
// REFERENCES:
//   - https://pkg.go.dev/encoding/base64
//   - https://pkg.go.dev/net/http
//   - https://gobyexample.com/base64-encoding
//   - https://golangdocs.com/base64-encoding-decoding-golang
//   - https://golangdocs.com/golang-download-files
//   - https://qiita.com/daijuk/items/d5c52b780e90387f2390
func Decode() error {
    const (
        //         helloworld
        encoded = "aGVsbG93b3JsZA=="
    )

    var (
        src = bytes.NewBufferString(encoded)
        dst = make([]byte, base64.StdEncoding.DecodedLen(src.Len()))
        err error
    )

    if _, err = base64.StdEncoding.Decode(dst, src.Bytes()); err != nil {
        return err
    }

    output.Stdoutl("[original]", encoded)
    output.Stdoutl("[decode  ]", string(dst))

    return nil
}
$ make run
go get -d ./...
go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: base64op_decode

[Name] "base64op_decode"
[original]           aGVsbG93b3JsZA==
[decode  ]           helloworld


[Elapsed] 105.3µs

参考資料

pkg.go.dev

pkg.go.dev

gobyexample.com

golangdocs.com

ja.wikipedia.org

webdesign-trends.net


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

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

devlights.github.io

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

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

github.com

github.com

github.com