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编码步骤

  1. 将原始数据每三个字节作为一组,每个字节是8个bit,所以一共是 24 个 bit
  2. 将 24 个 bit 分为四组,每组 6 个 bit
  3. 在每组前面加补 00,将其补全成四组8个bit
  4. 到此步,原生数据的3个字节已经变成4个字节了,增大了将近30%
  5. 根据Base64码表得到扩展后每个字节的对应符号

Base64字符串末尾的=是什么

Base64编码过程是3个字符一组的进行,不够3个,那么只能在编码后的字符串中补=了。缺一个字符补一个,缺两个补两个即可,所以有时候你会看见base64字符串结尾有1个或者2个=。

posted @ 2023-10-24 11:40  CrryG_GPC  阅读(430)  评论(0)    收藏  举报