Golang & PHP 针对base64的差异

背景

在重构app_url_handle的时候,有一段逻辑的数据是需要使用base64处理的,身为老鸡贼的我,本能的去看了下golang的文档,果然,用起来没有我想象的那么容易,两种语言还是有差异的,接下来我给大家举例并分析一波,以便理解。

概念

这里需要先普及一个概念和一个索引表

  1. base64双向的编码/解码协议,根据一个64字符的字符集定义,RFC 4648标准化了两种字符集。默认字符集用于MIME(RFC 2045)和PEM(RFC 1421)编码;另一种用于URL和文件名,用'-'和'_'替换了'+'和'/'。

  2. 如图为base64的索引表Golang & PHP 针对base64的差异

差异:

PHP实现:

实现的只是第一种常规字符集编码及MIME(RFC 2045),Golang & PHP 针对base64的差异

如果想放在url里传输,需要自己在进行封装一层,及将标准base64中的字符`/` 、 `+` 自行转成字符`-` 、`_` 并且去除尾部的字符`=` ,具体实现文档里也指出了,如下

Golang & PHP 针对base64的差异

golang实现:

golang分别实现了标准编码和url编码,这两种分别有不同函数,直接使用即可,并且可以忽略结尾的字符`=`进行加密、解密

 

标准编码加密: base64.StdEncoding.EncodeToString(data)

标准编码解密: base64.StdEncoding.DecodeString(str)

 

url编码加密:    base64.UrlEncoding.EncodeToString(data)

url编码解密:    base64.UrlEncoding.DecodeString(str)

 

附上相关文档传送门

PHP : https://www.php.net/manual/en/function.base64-decode

Golang : https://studygolang.com/pkgdoc    ( 搜下base64)

结论:

如果PHP里单纯的使用base64_encode/base64_decode函数,那么就对用golang的标准编码, 如果涉及url传输的,就用golang的url编码。