golang base64 StdEncoding和URLEncoding 踩坑

今天想着玩一玩腾讯的通用OCR(Optical Character Recognition,光学字符识别,就是文字识别了),官网只有php和py示例,翻译了半天,头疼

整了一下午,最后发现是栽在了base64上

package main

import (
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"net/url"
	"os"
)

func main() {
	// 这是一个图片文件路径
	file, _ := os.Open("./images/pic")
	data ,_ := ioutil.ReadAll(file)
	defer file.Close()
	a := base64.StdEncoding.EncodeToString(data)
	fmt.Println(a)
	fmt.Println(url.QueryEscape(a))
	b:=base64.URLEncoding.EncodeToString(data)
	fmt.Println(b)
	fmt.Println(url.QueryEscape(b))
	// stdEncoding,标准的base64出来的东西
	// iVBORw0KGgoAAAANSUhEUgAAAC4AAAAZAQMAAAB0CI5hAAAABlBMVEX5+fkAAAApsJofAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARklEQVQImWNgIBPwnz9/vKGBgYPBg8MRQjmBqA4GlwYG/ob+xo4GBgaHBicOIOXI4MJ/AER5MACVOHKAKPZG9v4DDSTbCgCwEhEB6ymwQwAAAABJRU5ErkJggg==
	// 经过url编码的
	// iVBORw0KGgoAAAANSUhEUgAAAC4AAAAZAQMAAAB0CI5hAAAABlBMVEX5%2BfkAAAApsJofAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARklEQVQImWNgIBPwnz9%2FvKGBgYPBg8MRQjmBqA4GlwYG%2Fob%2Bxo4GBgaHBicOIOXI4MJ%2FAER5MACVOHKAKPZG9v4DDSTbCgCwEhEB6ymwQwAAAABJRU5ErkJggg%3D%3D
	// urlEncoding,一定程度上更“安全”,但我这里不需要啊
	// iVBORw0KGgoAAAANSUhEUgAAAC4AAAAZAQMAAAB0CI5hAAAABlBMVEX5-fkAAAApsJofAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARklEQVQImWNgIBPwnz9_vKGBgYPBg8MRQjmBqA4GlwYG_ob-xo4GBgaHBicOIOXI4MJ_AER5MACVOHKAKPZG9v4DDSTbCgCwEhEB6ymwQwAAAABJRU5ErkJggg==
	// 在上面的基础上再编码
	// iVBORw0KGgoAAAANSUhEUgAAAC4AAAAZAQMAAAB0CI5hAAAABlBMVEX5-fkAAAApsJofAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARklEQVQImWNgIBPwnz9_vKGBgYPBg8MRQjmBqA4GlwYG_ob-xo4GBgaHBicOIOXI4MJ_AER5MACVOHKAKPZG9v4DDSTbCgCwEhEB6ymwQwAAAABJRU5ErkJggg%3D%3D
}

我大概解释一下

Base64 是一种任意二进制到文本字符串的编码方法,
常用于在 URL、Cookie、网页中传输少量二进制数据。
  • stdEncoding就是标准的base64,这个不用多讲

    • base64呢,是把咱们的数据都转换成52个大小写字母、"/"、"+"、0-9,而上面看到还有一个特殊的"=",这个=不属于上面的64个兄弟姐妹
    • base64编码第一步把每三个字节分成一组,一组24位
    • 第二步把24位中的每6位前面补俩0,这样就成了32位了(为啥要凑32位呢?我现在还不知道作者是怎么想的,猜一下,为了凑cpu的32位元)
    • 剩下的,因为2^6 是64,第二步筹够了一个字节,那每个字节解析成对应的字符就可以了。上面说了三个字节一组,那不够3的倍数咋办?比如gbk的“你好”是四个字节,缺的俩小兄弟就由“=”去顶上了,所以“=”只在最后出现一个或两个,是用来凑数的。至于为啥?俺不知道还
  • urlEncoding是对标准编码方式做的一些处理,因为“+”和“/”如果一不小心作为参数直接出现在url地址栏里面,就造成歧义了,然后后面就出现了urlEncoding这种东西,他把“/”换成“_”,把“+”换成“-”,这样经过url编码就不会造成歧义,参数就是参数,剩下的就只有“=”可能会有些问题,有些解析方法会省略掉后缀。大概就是这么一回事,在一些场景下可能会出现问题,这个东西就出来了

总结
base64是一种解析方式,把二进制文件成64个字符组成的字符串进行表示,常见于网页
上的一些小东西的传输,文中提到的两种方式只是因为特定场景需要,而产生了不同的
表示方法,当然还有其他的方法,有他们各自的特点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值