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]
Ответы
Ответ 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
}
Попробуйте!
Ответ 4
См. этот пример (код/декодирование base64):
http://play.golang.org/p/t6rFm2x4Yr
@firebitsbr