45

ここに私のコードがありますが、デコード機能が機能しない理由がわかりません。

少しの洞察は素晴らしいでしょう。

func EncodeB64(message string) (retour string) {
    base64Text := make([]byte, base64.StdEncoding.EncodedLen(len(message)))
    base64.StdEncoding.Encode(base64Text, []byte(message))
    return string(base64Text)
}

func DecodeB64(message string) (retour string) {
    base64Text := make([]byte, base64.StdEncoding.DecodedLen(len(message)))
    base64.StdEncoding.Decode(base64Text, []byte(message))
    fmt.Printf("base64: %s\n", base64Text)
    return string(base64Text)
}

それは私に与えました:[デコードエラー - utf-8ではない出力][デコードエラー - utf-8ではない出力]

4

4 に答える 4

33

len プレフィックスは表面的なものであり、無効な utf-8 エラーを引き起こします。

package main

import (
        "encoding/base64"
        "fmt"
        "log"
)

func main() {
        str := base64.StdEncoding.EncodeToString([]byte("Hello, playground"))
        fmt.Println(str)

        data, err := base64.StdEncoding.DecodeString(str)
        if err != nil {
                log.Fatal("error:", err)
        }

        fmt.Printf("%q\n", data)
}

こちらも)


出力

SGVsbG8sIHBsYXlncm91bmQ=
"Hello, playground"

編集:私はあまりにも速く読んだ.lenは接頭辞として使用されていなかった. ディストロイはそれを正しく理解しました。

于 2013-03-11T08:46:12.677 に答える
32

DecodedLen最大長を返します。

この長さはバッファのサイズ設定に役立ちますが、バッファの一部は書き込まれないため、有効なUTF-8にはなりません。

関数によって返される実際に書き込まれた長さのみを使用する必要がありDecodeます。

l, _ := base64.StdEncoding.Decode(base64Text, []byte(message))
log.Printf("base64: %s\n", base64Text[:l])
于 2013-03-11T08:52:33.587 に答える