猿问

对于看似有效的 png,输入字节处的非法 base64 数据

我正在尝试解码从 javascript 画布的 toDataURL 函数生成的数据 URL。


以下 golang 应用程序失败并出现错误illegal base64 data at input byte 129)


package main


import (

    "encoding/base64"

    "fmt"

    "net/url"

    "strings"

)


func main() {

    pngData := "iVBORw0KGgoAAAANSUhEUgAAAF0AAAABCAYAAAC8PaJPAAAABHNCSVQICAgIfAhkiAAAALVJREFUGFdt0MsKQVEYhuG9CeU0VgamihBl6hqMXYoLchduQFuKicyFARPn0/J+9Q2tevrba639H1YcQhhHUTTBACloFZHFw3FJbODj7xdxjSqmqGCHms+3vv8m3nDwWSA+vVcipjFHHlcMcUTBtcuueSHqfgzlVJ7Nn/o99s5Qf3v0sUAHK///JbahmZQ3gy4S96OZc9A90fkdepM6tNTHDOqz6T3NofeTluuqV82oHOrphNEPw3UwfBVmbU4AAAAASUVORK5CYII="

    pngData, err := url.PathUnescape(pngData)


    if err != nil {

        fmt.Printf("Failed to unescape", err.Error())

        return

    }

    pngData = strings.Replace(pngData, "+", "", -1)

    _, err = base64.URLEncoding.WithPadding(base64.NoPadding).DecodeString(pngData)

    if err != nil {

        fmt.Printf("Failed to decode", err.Error())

    }

}

如果我将 pngData 中的值传递到基于web 的 base64 到 png 转换器中,则生成图像没有问题。(一条白色值的水平线)

我已经尝试过 StdEncoding、RawURLEncoding 和它们的 Raw 对应物。我也尝试过使用或不使用填充,并且我尝试了相同的 pngData 字符串,带有一个额外的 = 并且没有尾随 =。

关于为什么 Golang 拒绝解码这些数据的任何想法?

我从画布中获得的一些图像解码得很好。但有些人,比如这个,没有。


繁花如伊
浏览 144回答 2
2回答

动漫人物

Steven Penny 的回答显示了一种方法,但我不得不问:你为什么打电话url.PathUnescape?数据不包含路径转义字符(无%-encoding)。这个电话是无害的,但没有必要。为什么使用备用编码 ( URLEncoding)?正如我们在base64 包文档中看到的,标准编码和备用编码之间的区别在于备用编码使用-and_代替+and /。但是如果我们查看数据字符串,它包含加号和斜线,并且没有破折号或下划线,因此它显然已经使用标准编码进行了编码。你为什么叫base64.NoPadding?输入数据以 结尾=,这是一个填充字符。你为什么打电话给base64.NoPadding via base64.URLEncoding.WithPadding(base64.NoPadding)?文档告诉我们,这可以拼写base64.RawURLEncoding。为什么你明确要求去除+字符(不是一个好主意)而不是/字符?如果我们删除所有这些(并为了发布目的而拆分一个长输入行),我们会得到这个(操场链接):package mainimport (    "encoding/base64"    "fmt")func main() {    data := "iVBORw0KGgoAAAANSUhEUgAAAF0AAAABCAYAAAC8PaJPAAAABH" +        "NCSVQICAgIfAhkiAAAALVJREFUGFdt0MsKQVEYhuG9CeU0Vgam" +        "ihBl6hqMXYoLchduQFuKicyFARPn0/J+9Q2tevrba639H1YcQh" +        "hHUTTBACloFZHFw3FJbODj7xdxjSqmqGCHms+3vv8m3nDwWSA+" +        "vVcipjFHHlcMcUTBtcuueSHqfgzlVJ7Nn/o99s5Qf3v0sUAHK/" +        "//JbahmZQ3gy4S96OZc9A90fkdepM6tNTHDOqz6T3NofeTluuq" +        "V82oHOrphNEPw3UwfBVmbU4AAAAASUVORK5CYII="    b, err := base64.StdEncoding.DecodeString(data)    if err != nil {        fmt.Printf("Failed to decode: %s\n", err)    } else {        fmt.Printf("bytes begin with: %q\n", b[0:4])    }}

LEATH

这似乎工作正常:package mainimport (   "encoding/base64"   "image"   "image/png"   "os"   "strings")func main() {   s := `iVBORw0KGgoAAAANSUhEUgAAAF0AAAABCAYAAAC8PaJPAAAABHNCSVQICAgIfAhkiAAAALVJREFUGFdt0MsKQVEYhuG9CeU0VgamihBl6hqMXYoLchduQFuKicyFARPn0/J+9Q2tevrba639H1YcQhhHUTTBACloFZHFw3FJbODj7xdxjSqmqGCHms+3vv8m3nDwWSA+vVcipjFHHlcMcUTBtcuueSHqfgzlVJ7Nn/o99s5Qf3v0sUAHK///JbahmZQ3gy4S96OZc9A90fkdepM6tNTHDOqz6T3NofeTluuqV82oHOrphNEPw3UwfBVmbU4AAAAASUVORK5CYII=`   d := base64.NewDecoder(base64.StdEncoding, strings.NewReader(s))   p, e := png.Decode(d)   if e != nil {      panic(e)   }   c, e := os.Create("a.png")   if e != nil {      panic(e)   }   png.Encode(c, p.(*image.NRGBA))}
随时随地看视频慕课网APP
我要回答