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

在 Golang 中将文件编码为 base64 时丢失一个字节

在 Golang 中将文件编码为 base64 时丢失一个字节

Go
繁华开满天机 2022-12-26 16:26:41
package mainimport (    "bytes"    "encoding/base64"    "fmt"    "io"    "log"    "os")func b(name string) {    f, err := os.Open(name)    if err != nil {        log.Fatal(err)    }    defer f.Close()    buf := new(bytes.Buffer)    binval := base64.NewEncoder(base64.StdEncoding, buf)    if _, err := io.Copy(binval, f); err != nil {        log.Fatal(err)    }    fmt.Printf("%s\n", buf.String()[buf.Len()-5:])}func main() {    b("soccer.jpg")    b("soccer2.jpg")}足球.jpg 足球 2.jpg输出:bodqhrohro@debian:/tmp$ go run base64.go nuNf/nuNf/第一个文件与第二个文件相同,只是删除了最后一个字节。它们产生相同的 base64 字符串。怎么了?我用go1.15.9和go1.18.3体验过。
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

来自base64.NewEncoder 文档

调用者必须关闭返回的编码器以刷新任何部分写入的块。

所以:

binval.Close() // <- add this
fmt.Printf("%s\n", buf.String()[buf.Len()-5:])

另请参阅文档示例


// Must close the encoder when finished to flush any partial blocks.

// If you comment out the following line, the last partial block "r"

// won't be encoded.

encoder.Close()


查看完整回答
反对 回复 2022-12-26
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

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