golang大图片转base64
遇到的问题
在使用golang将图片转为base64时,发现如果图片体积太大后台输出的结果总是不对,而且每次输出的结果还不一样。
原因
因为图片在转base64时,base64的编码会比图片大很多,1M的图片转成base64就高达百万了,这比论文字数都多。
解决方法
直接将base64编码写进一个文件之中,再读取文件内容
代码
package main
import (
"encoding/base64"
"fmt"
"os"
)
func main() {
path := "statuc/1.jpg"
file, err := os.ReadFile(path)
if err != nil {
fmt.Println("OpenFile err:", err)
}
buffstore := make([]byte, 5000000)
base64.StdEncoding.Encode(buffstore, file)
os.WriteFile("./output.txt", buffstore, 0666)
}
图片转base64
在将图片转为base64时我们会发现体积会变
什么是base64?
Base64是一种二进制到文本的编码方式。如果要更具体一点的话,可以认为它是一种将 byte数组编码为字符串的方法,而且编码出的字符串只包含ASCII基础字符。
例如字符串Hello world对应的Base64为SGVsbG8gd29ybGQ=。
值得注意的是Base64不是加密算法,其仅仅是一种编码方式,算法也是公开的,所以不能依赖它进行加密。
为什么叫base64?
因为它是基于(Base)64个字符的一种编码方式。使用其编码后的文本只包含64个ASCII码字符(偶尔加一个填充字符=),如下所示:
Base64使用到的64个字符:
A-Z 26个
a-z 26个
0-9 10个
+ 1个
/ 1个
base64的使用场景
- 证书
- 电子邮件的附件,因为附件往往有不可见字符
- xml 中如果像嵌入另外一个 xml 文件,直接嵌入,往往 xml 标签就乱套了, 不容易解析,因此,需要把 xml 编译成字节数组的字符串,编译成可见字符。
- 网页中的一些小图片,可以直接以 base64 编码的方式嵌入,不用再链接请求消耗网络资源。
- 较老的纯文本协议 SMTP ,这些文本偶尔传输一个文件时,需要用 base64
base64编码步骤
- 将原始数据每三个字节作为一组,每个字节是8个bit,所以一共是 24 个 bit
- 将 24 个 bit 分为四组,每组 6 个 bit
- 在每组前面加补 00,将其补全成四组8个bit
- 到此步,原生数据的3个字节已经变成4个字节了,增大了将近30%
- 根据Base64码表得到扩展后每个字节的对应符号
Base64字符串末尾的=是什么
Base64编码过程是3个字符一组的进行,不够3个,那么只能在编码后的字符串中补=了。缺一个字符补一个,缺两个补两个即可,所以有时候你会看见base64字符串结尾有1个或者2个=。

浙公网安备 33010602011771号