概要
たまに base64 でバイナリを送ったりすることがあるので、忘れないうちにここにメモメモ。
サンプル
エンコード
普通の文字列をBase64することは個人的にあまり無いので、適当なバイナリファイルとして Unsplash の画像を使わせてもらってます。
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
参考資料
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場