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