base64解码,然后json解码:base64.NewDecoder EOF错误和json无效字符错误

时间:2018-10-19 17:12:51

标签: go encoding base64

我正在尝试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错误。

第一个策略出了什么问题?

1 个答案:

答案 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}