首页 > 其他分享 >golang base64解码

golang base64解码

时间:2023-09-03 14:56:31浏览次数:55  
标签:encrypt DecodeString err 解码 base64 golang main fmt

解码过程

1.使用标准库的base64.StdEncoding.DecodeString

  最开始是印象标准库有一个base64.StdEncoding.DecodeString方法可以解码,就直接使用了这个方法

package main
 
import(
    "encoding/base64"
    "fmt"
)
 
func main(){
    encrypt := "Cf1WA2nBMo3H9G2UPhlLBBVBsMDl4udWr7__e6Iy93eIqLKi3EOjGhk8TkHujL1Uj6aGfZJNBzIbVE2NfNaz4pob8uiQvGaeTZdWP-8lFmAm6J1sz8N15xQkO7ADa5bNLCCqtlQbN2z7JcNenvFuID_rZGqb_1gmr-BGubGRMiMSK7RdjQYrMHaBcHLPB0UteakzcQwgKxCW7u0ECHqPJ39ne9JUG22JBWRo1ORuX5r30J_XrW3SQcdPSxfe0kvd61y12QOYh8VlOBBdBeDNnyDXefI_tDJDBFeqTXCgKu9wFkkWIZiM7WwqogaY-bvjUisbrPO4_fjJ1c0nWDOqRA"
    _,err := base64.StdEncoding.DecodeString(encrypt)
    if err != nil {
        fmt.Println(err)
    }
}

执行结果

illegal base64 data at input byte 34

解码报错了,根据提示意思大概能猜到是第34位的字符‘_’ base64不认识,去查了下base64的索引表

 发现base64的字符集内没有我们第34位对应的字符‘_’,当时想是不是做了类似urlencode的编码,防止http传输过程中部分字符转义,继续查base64文档发现了 如下一段内容

 可以确定是将+和/分别改成了-和_, 那我们应该做一下字符串替换把-和_改回来就行,本来想直接在代码里面写字符串替换,后来想GO标准库还没细看,里面是不是还有现成的方法之前没发现,查了下标准库发现

 URLEncoding和我们刚用的StdEncoding有一些区别,是用于URL和文件名,刚我们碰到的问题也是URL问题

2.用base64.URLEncoding.DecodeString方法尝试

  经过了上一步的测试和文档查找,感觉用这个方法应该就可以搞定问题了,赶紧写个测试看看

package main
 
import(
    "encoding/base64"
    "fmt"
)
 
func main(){
    encrypt := "Cf1WA2nBMo3H9G2UPhlLBBVBsMDl4udWr7__e6Iy93eIqLKi3EOjGhk8TkHujL1Uj6aGfZJNBzIbVE2NfNaz4pob8uiQvGaeTZdWP-8lFmAm6J1sz8N15xQkO7ADa5bNLCCqtlQbN2z7JcNenvFuID_rZGqb_1gmr-BGubGRMiMSK7RdjQYrMHaBcHLPB0UteakzcQwgKxCW7u0ECHqPJ39ne9JUG22JBWRo1ORuX5r30J_XrW3SQcdPSxfe0kvd61y12QOYh8VlOBBdBeDNnyDXefI_tDJDBFeqTXCgKu9wFkkWIZiM7WwqogaY-bvjUisbrPO4_fjJ1c0nWDOqRA"
    _,err := base64.URLEncoding.DecodeString(encrypt)
    if err != nil {
        fmt.Println(err)
    }
}

执行一下 又报错了,心累,看了下错误信息illegal base64 data at input byte 340,跟第一步报错的大致一样只是最后的位置变到了340,说明我们前面转义的问题用这个方法还是解决了,但是执行到最后的时候又有不标准字符了,继续查base64的文档,又有新发现,如图

 大致意思是,如果编码的时候字节不足会在最后加一到两个=号,但看我们的字符串最后没有=,解码的时候解到最后又报错了,赶紧给字符串手动加个等号试试

package main
 
import(
    "encoding/base64"
    "fmt"
)
 
func main(){
    encrypt := "Cf1WA2nBMo3H9G2UPhlLBBVBsMDl4udWr7__e6Iy93eIqLKi3EOjGhk8TkHujL1Uj6aGfZJNBzIbVE2NfNaz4pob8uiQvGaeTZdWP-8lFmAm6J1sz8N15xQkO7ADa5bNLCCqtlQbN2z7JcNenvFuID_rZGqb_1gmr-BGubGRMiMSK7RdjQYrMHaBcHLPB0UteakzcQwgKxCW7u0ECHqPJ39ne9JUG22JBWRo1ORuX5r30J_XrW3SQcdPSxfe0kvd61y12QOYh8VlOBBdBeDNnyDXefI_tDJDBFeqTXCgKu9wFkkWIZiM7WwqogaY-bvjUisbrPO4_fjJ1c0nWDOqRA"
    //为了不修改原字符串,没有直接在原字符串上追加
    encrypt = fmt.Sprint(encrypt,"==")
    _,err := base64.URLEncoding.DecodeString(encrypt)
    if err != nil {
        fmt.Println(err)
    }
}
View Code

加了两个等号,居然解码成功了,太不容易了,但是这问题也来了, 这追加的等号也不是固定的,如果在代码里面判断增加也很不方便啊,刚尝到查GO文档的好处了,带着问题找一个可以忽略最后等号的方法,看下GO文档里有没有,

3.使用base64.RawURLEncondig.DecodeString

前一个步骤我们得到的结论要在GO文档中找一个可以将-_还原成base64字符的同时可以让我们忽略末尾=号的,嗯 还真找到了一个base64.RawURLEncoding.DecodeString,赶紧试下

package main
 
import(
    "encoding/base64"
    "fmt"
)
 
func main(){
    encrypt := "Cf1WA2nBMo3H9G2UPhlLBBVBsMDl4udWr7__e6Iy93eIqLKi3EOjGhk8TkHujL1Uj6aGfZJNBzIbVE2NfNaz4pob8uiQvGaeTZdWP-8lFmAm6J1sz8N15xQkO7ADa5bNLCCqtlQbN2z7JcNenvFuID_rZGqb_1gmr-BGubGRMiMSK7RdjQYrMHaBcHLPB0UteakzcQwgKxCW7u0ECHqPJ39ne9JUG22JBWRo1ORuX5r30J_XrW3SQcdPSxfe0kvd61y12QOYh8VlOBBdBeDNnyDXefI_tDJDBFeqTXCgKu9wFkkWIZiM7WwqogaY-bvjUisbrPO4_fjJ1c0nWDOqRA"
    _,err := base64.RawURLEncoding.DecodeString(encrypt)
    if err != nil {
        fmt.Println(err)
    }
}

执行下,终于完美成功了。

总结

     base64编码过程有两部特殊操作

  •    url safe 将+/字符串转化成_-
  •    no padding is add  末尾不增加=号
base64.StdEncoding        // 标准的base64编码,如RFC 4648中所定义
base64.RawStdEncoding    // 与 StdEncoding 相同,但省略了填充字符
base64.URLEncoding        // RFC 4648中定义的备用base64编码。它通常用于URL和文件名。(将+/字符串转化成_-)
base64.RawURLEncoding    // 与 URLEncoding 相同,但省略了填充字符

 



转自:golang base64解码碰到的坑_base64.stdencoding.decodestring_只会打野怪我咯的博客-CSDN博客

标签:encrypt,DecodeString,err,解码,base64,golang,main,fmt
From: https://www.cnblogs.com/ylz8401/p/17674976.html

相关文章

  • golang realize数据库简介
    存储与数据库简介一个提供了读写,控制类接口,能够安全有效的把数据持久化的软件,就可以成为存储系统。-存储系统概览存储系统特点性能敏感既简单又复杂容易受硬件影响存储器层级结构单机存储栈RAID技术单块大容量磁盘的价格>多块小容量的磁盘单块磁盘的写入性能<多块磁盘的并发写入......
  • jetbrains GoLang设置编写proto文件的实时模板
    具体步骤1. 首先,先创建一个模板组,我这里创建为"proto"。2.下面这张图是我的模板组中的内容3.具体实时模板缩写:enum描述:enumname{}模板文字:enum$name${$END$}适用于:协议缓存区中的Other缩写:import描述:import"";模板文字:import"$file$";$END$适用......
  • 第一次接触golang的体验
    ay01今天是第一次接触golang,之前学java用了不少精力,借着这次的青训营有机会学习go来开发后端,是一次难得的经历。经过这几个小时的学习,已经了解了大部分基础语法,说实话,比起java来说,语法还是有很大不同,适应起来比较慢,网络上的教程也比较少,一个scan语法我都花了不少时间,真是惭愧。不......
  • 通过调整解码器参数,EasyPlayer.js可以实现H.265音频解码
    EasyPlayer是一款稳定且流畅的流媒体播放器,它能够支持H.264和H.265视频播放。该播放器能够处理各种视频流格式,包括RTSP、RTMP、HLS、FLV和WebRTC等。EasyPlayer具备多个版本,例如EasyPlayer-RTSP、EasyPlayer.js和EasyPlayerPro,以满足不同用户在不同场景下的需求。此外,EasyPlayer还......
  • 安防视频监控平台EasyCVR如何将默认快照的raw格式改为jpg/base64格式?
    视频监控/视频汇聚/安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频云存储EasyCVR平台能在复杂的网络环境中,将分散的各类视频资源进行统......
  • js base64转blob
    /**base64转换成blob数据*/base64ToBlob(dataUrl,type){vararr=dataUrl.split(',');varmime=arr[0].match(/:(.*?);/)[1]||type;//去掉url的头,并转化为bytevarbytes=window.atob(arr[1]);......
  • Golang操作MongoDB
    MongoDB介绍MongoDB是一种非关系型数据库,C++编写的分布式文档型号数据库,内部使用类似于JSON的bson二进制格式。支持单机、主从(废弃)、副本集、Sharding分片等多种高可用架构。具体参考 https://blog.51cto.com/oldlees/7273362驱动驱动:https://www.mongodb.com/docs/drivers/Go驱动......
  • golang 协程、延迟函数调用、以及恐慌和恢复
    此篇文章将介绍协程和延迟函数调用。协程和延迟函数调用是Go中比较独特的两个特性。恐慌和恢复也将在此篇文章中得到简单介绍。本文并非全面地对这些特性进行介绍,后面的其它文章会陆续补全本文的未介绍的内容。协程(goroutine)现代CPU一般含有多个核,并且一个核可能支持多线程。......
  • golang 配置断点调试
    golang1.8以下版本安装dlvgoinstallgithub.com/go-delve/delve/cmd/[email protected] 配置如图    配置gobuild  使用自己的启动语句调试......
  • golang官方包管理vendor模式无法引用非go文件
    主页微信公众号:密码应用技术实战博客园首页:https://www.cnblogs.com/informatics/背景&问题golang作为高级计算机语言之一,在云原生以及web网站建设中发挥了重要作用,但在实际应用中我们可能会碰到以下场景,在该场景下:部署机无法访问外网,无法直接从互联网下载依赖包golang依......