英文:
One byte is lost when encoding a file into base64 in Golang
问题
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")
}
输出:
bodqhrohro@debian:/tmp$ go run base64.go
nuNf/
nuNf/
第一个文件与第二个文件相同,只是最后一个字节被删除了。它们生成了相同的base64字符串。有什么问题吗?
我在go1.15.9和go1.18.3上都遇到了这个问题。
英文:
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")
}
Output:
bodqhrohro@debian:/tmp$ go run base64.go
nuNf/
nuNf/
The first file is identical to the second one just with the last byte cut out. They yield an identical base64 string. What's wrong?
I experience it with go1.15.9 and go1.18.3.
答案1
得分: 2
从 base64.NewEncoder 文档 中可以看到:
> 调用者必须关闭返回的编码器,以刷新任何部分写入的块。
所以:
binval.Close() // <- 添加这行
fmt.Printf("%s\n", buf.String()[buf.Len()-5:])
还可以参考文档中的 示例:
// 在完成后必须关闭编码器,以刷新任何部分块。
// 如果你注释掉下面这行,最后一个部分块 "r" 将不会被编码。
encoder.Close()
英文:
From the base64.NewEncoder docs:
> the caller must Close the returned encoder to flush any partially
> written blocks.
So:
binval.Close() // <- add this
fmt.Printf("%s\n", buf.String()[buf.Len()-5:])
see also the doc's example:
// 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()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论