为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
繁花如伊 2022-07-18 16:03:56
我正在尝试解码从 javascript 画布的 toDataURL 函数生成的数据 URL。以下 golang 应用程序失败并出现错误illegal base64 data at input byte 129)package mainimport (    "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 拒绝解码这些数据的任何想法?我从画布中获得的一些图像解码得很好。但有些人,比如这个,没有。
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

Steven Penny 的回答显示了一种方法,但我不得不问:

  • 你为什么打电话url.PathUnescape?数据不包含路径转义字符(无%-encoding)。这个电话是无害的,但没有必要。

  • 为什么使用备用编码 ( URLEncoding)?正如我们在base64 包文档中看到的,标准编码和备用编码之间的区别在于备用编码使用-and_代替+and /。但是如果我们查看数据字符串,它包含加号和斜线,并且没有破折号或下划线,因此它显然已经使用标准编码进行了编码。

  • 你为什么叫base64.NoPadding?输入数据以 结尾=,这是一个填充字符。

  • 你为什么打电话给base64.NoPadding via base64.URLEncoding.WithPadding(base64.NoPadding)?文档告诉我们,这可以拼写base64.RawURLEncoding

  • 为什么你明确要求去除+字符(不是一个好主意)而不是/字符?

如果我们删除所有这些(并为了发布目的而拆分一个长输入行),我们会得到这个(操场链接):

package main


import (

    "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])

    }

}


查看完整回答
反对 回复 2022-07-18
?
LEATH

TA贡献1936条经验 获得超6个赞

这似乎工作正常:


package main


import (

   "encoding/base64"

   "image"

   "image/png"

   "os"

   "strings"

)


func main() {

   s := `iVBORw0KGgoAAAANSUhEUgAAAF0AAAABCAYAAAC8PaJPAAAABHNCSVQICAgIfAhkiAAAALVJ

REFUGFdt0MsKQVEYhuG9CeU0VgamihBl6hqMXYoLchduQFuKicyFARPn0/J+9Q2tevrba639H1YcQhhHU

TTBACloFZHFw3FJbODj7xdxjSqmqGCHms+3vv8m3nDwWSA+vVcipjFHHlcMcUTBtcuueSHqfgzlVJ7Nn/

o99s5Qf3v0sUAHK///JbahmZQ3gy4S96OZc9A90fkdepM6tNTHDOqz6T3NofeTluuqV82oHOrphNEPw3U

wfBVmbU4AAAAASUVORK5CYII=`

   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))

}


查看完整回答
反对 回复 2022-07-18
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信