Подтвердить что ты не робот

Encode/Decode base64

вот мой код, и я не понимаю, почему функция декодирования не работает.

Маленькое понимание было бы здорово.

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]

4b9b3361

Ответ 1

DecodedLen возвращает длину максимальная.

Эта длина полезна для калибровки вашего буфера, но часть буфера не будет записана и, следовательно, будет недействительной UTF-8.

Вы должны использовать только реальную длину записи, возвращаемую функцией Decode.

l, _ := base64.StdEncoding.Decode(base64Text, []byte(message))
log.Printf("base64: %s\n", base64Text[:l])

Ответ 2

Префикс 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"

EDIT: я читал слишком быстро, len не использовался в качестве префикса. dystroy получил это право.

Ответ 3

Подводя итог другим двум сообщениям, вот две простые функции для кодирования/декодирования строк Base64 с помощью Go:

// Dont forget to import "encoding/base64"!

func base64Encode(str string) string {
    return base64.StdEncoding.EncodeToString([]byte(str))
}

func base64Decode(str string) (string, bool) {
    data, err := base64.StdEncoding.DecodeString(str)
    if err != nil {
        return "", true
    }
    return string(data), false
}

Попробуйте!