Quantcast
Channel: いろいろ備忘録日記
Viewing all articles
Browse latest Browse all 1458

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

$
0
0

概要

たまに 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/d5c52b780e90387f2390func 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]))

    returnnil
}
$ 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/d5c52b780e90387f2390func 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))

    returnnil
}
$ 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


Viewing all articles
Browse latest Browse all 1458

Trending Articles