我正在尝试base64解码HTTP请求,然后使用JSON解码器对其进行解码。
我尝试了两种方法来实现base64解码器:
func decode(encoded []byte) ([]byte, error) {
buff := new(bytes.Buffer)
decoder := base64.NewDecoder(base64.StdEncoding, buff)
_, err := decoder.Read(encoded)
return buff.Bytes(), err
}
此函数返回EOF错误。前往游乐场链接:https://play.golang.org/p/038rEXWYW6q
func decode(encoded []byte) ([]byte, error) {
decoded := make([]byte, base64.StdEncoding.EncodedLen(len(encoded)))
_, err := base64.StdEncoding.Decode(decoded, encoded)
return decoded, err
}
此方法有效,但具有额外的x\00
个字符,因此在解码JSON时会出现invalid character '\x00' after top-level value
错误。
第一个策略出了什么问题?
答案 0 :(得分:1)
在您的代码中:
您正在创建一个新的缓冲区并将其分配给buff
,因为您没有为其提供任何输入源,所以它为空。
buff := new(bytes.Buffer)
和NewDecoder
正在从空白的buff
中读取。
像进行中的所有操作一样,如果要创建新内容,则应使用始终以package.Newxxx
bytes.NewBuffer(src)
然后decoder
是一个变量,它包含实际的解码数据,并且具有reader interface
(Read方法)。因此,您可以将其传递给接受reader interface
的方法,而ioutil.ReadAll()
是其中之一。
在必要时添加评论:
package main
import (
"bytes"
"encoding/base64"
"fmt"
"io/ioutil"
"log"
)
// encoded data
var data = "eyJhY3Rpdml0aWVzIjpbXSwic3VjY2VzcyI6ZmFsc2UsImNvZGUiOjk5OTl9"
func main() {
dec, err := decode([]byte(data))
if err != nil {
log.Println(err)
}
fmt.Println(string(dec)) // print returned value
}
func decode(enc []byte) ([]byte, error) {
// create new buffer from enc
// you can also use bytes.NewBuffer(enc)
r := bytes.NewReader(enc)
// pass it to NewDecoder so that it can read data
dec := base64.NewDecoder(base64.StdEncoding, r)
// read decoded data from dec to res
res, err := ioutil.ReadAll(dec)
return res, err
}
事实上,整个事情可以写成一行:
func decode(enc []byte) ([]byte, error) {
return ioutil.ReadAll(base64.NewDecoder(base64.StdEncoding, bytes.NewReader(enc)))
}
输出:
{"activities":[],"success":false,"code":9999}