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

package main


import (

    "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体验过。


繁华开满天机
浏览 93回答 1
1回答

炎炎设计

来自base64.NewEncoder 文档:调用者必须关闭返回的编码器以刷新任何部分写入的块。所以:binval.Close()&nbsp;//&nbsp;<-&nbsp;add&nbsp;this fmt.Printf("%s\n",&nbsp;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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go