Golang处理大文件时Base64编解码后字节长度不匹配问题
Golang Base64编解码字节缺失问题原因与修复
问题原因
- 核心诱因:编码阶段未显式关闭
base64.Encoder实例。Go标准库的base64.NewEncoder返回值实现了io.WriteCloser接口,Base64编码逻辑以3字节为一组处理输入,当输入末尾不足3字节时,会生成12个填充字符`=`补全4字节的编码组,这部分收尾数据会暂存在编码器内部缓冲区,只有调用`Close()`方法才会将缓冲区数据全部刷入输出流。现有代码仅对输入输出文件做了延迟关闭,未关闭编码器,导致末尾12字节原始数据对应的编码内容未写入输出文件,解码时自然缺失对应字节,完全匹配观测到的1/2字节缺失现象。 - 非功能性问题:解码函数的错误日志存在笔误,解码失败时的提示语写为
Failed to encode file,不会影响逻辑运行,但会干扰问题排查。
修复后的代码
package main import ( "encoding/base64" "io" "log" "os" ) func Encode(infile, outfile string) error { input, err := os.Open(infile) if err != nil { return err } defer input.Close() output, err := os.Create(outfile) if err != nil { return err } defer output.Close() encoder := base64.NewEncoder(base64.StdEncoding, output) // 新增:延迟关闭编码器,刷入剩余缓冲数据 defer encoder.Close() l, err := io.Copy(encoder, input) if err != nil { log.Printf("Failed to encode file:%v", err) return err } log.Printf("Wrote %v bytes", l) return nil } func Decode(infile, outfile string) error { input, err := os.Open(infile) if err != nil { return err } defer input.Close() output, err := os.Create(outfile) if err != nil { return err } defer output.Close() decoder := base64.NewDecoder(base64.StdEncoding, input) l, err := io.Copy(output, decoder) if err != nil { // 修复日志笔误 log.Printf("Failed to decode file:%v", err) return err } log.Printf("Wrote %v bytes", l) return nil }
内容的提问来源于stack exchange,提问作者Madhu
相关产品推荐
相关产品推荐

