golang 自行实现一个base64加密
2023-03-10 14:16 dribs 阅读(131) 评论(0) 编辑 收藏 举报1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | package main import ( "fmt" "strconv" ) const base64table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" func Mybase64(a string) { //定义一个byte数组 放要base64的字符 d := []byte(a) //定义一个string 放解析的二进制 var s string //定义补余个数用于最后==计算 var buyu int //取模,3个一断,每个8个位 共24位,跟base64 6位一断,刚好凑4个。 if len(d)%3 != 0 { //计算要补多少个字符的0,不够三个字符的用0 补上去 buyu = 3 - len(d)%3 for i := 0; i < buyu; i++ { d = append(d, 0) } } //把要base64的字符转成一长串二进制,用于6个一断 for _, b := range d { s += fmt.Sprintf( "%08b" , b) } //6个一断 j := 6 //不写if 定义字典存放 补余的几个= buyumap := map [int]string{1: "=" , 2: "==" } var ret string for i := 0; i < len(s); i += 6 { s := fmt.Sprintf( "0b%s" , s[i:j]) j += 6 b, _ := strconv.ParseInt(s[2:], 2, 32) fmt.Printf( "%s===>%d==base64==>%s\n" , s, b, string(base64table[b])) ret += fmt.Sprintf(string(base64table[b])) } s2 := ret[0 : len(ret)-buyu] s3 := fmt.Sprintf( "%s%s" , s2, buyumap[buyu]) fmt.Println(s3) } func main() { Mybase64( "123a45671" ) //data := []byte("123a45671") //dst := make([]byte, base64.StdEncoding.EncodedLen(len(data))) //base64.StdEncoding.Encode(dst, data) //fmt.Println(string(dst)) } |
以下为chatGPT的回答解析,参考理论是对的,个别值解释的不对
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 当我们将字符串 "abcd" 转换成对应的ASCII码值时,得到97、98、99、100。然后将这四个值按照每3个一组进行分组,得到(97, 98, 99),(100)。 接着,将每组3个字节的数据拆分成4个6位的二进制数,这里以第一组为例: 第1个字节:97,对应的二进制数为 01100001 第2个字节:98,对应的二进制数为 01100010 第3个字节:99,对应的二进制数为 01100011 将这3个二进制数拼接在一起,得到24位的二进制数:01100001 01100010 01100011。 然后将这个24位的二进制数分成4个6位的二进制数: 第1个6位二进制数:011000,对应的十进制数为 24,Base64字符集中对应的字符为 'Y' 。 第2个6位二进制数:010110,对应的十进制数为 22,Base64字符集中对应的字符为 'W' 。 第3个6位二进制数:001100,对应的十进制数为 12,Base64字符集中对应的字符为 'M' 。 第4个6位二进制数:000001,对应的十进制数为 1,Base64字符集中对应的字符为 'B' 。 对于第二组(100),因为只有一个字节,所以需要在末尾添加两个字节值为0的字节,得到(100, 0, 0)。 将这三个字节拼接在一起,得到16位的二进制数:01100100 00000000 00000000。 然后将这个16位的二进制数分成3个6位的二进制数和1个填充字符: 第1个6位二进制数:011001,对应的十进制数为 25,Base64字符集中对应的字符为 'Z' 。 第2个6位二进制数:000000,对应的十进制数为 0,Base64字符集中对应的字符为 'A' 。 第3个6位二进制数:000000,对应的十进制数为 0,Base64字符集中对应的字符为 'A' 。 第一个填充字符: '=' 最后,将这4个Base64字符拼接在一起,得到 "YWJjZA== " ,这就是字符串 "abcd" 的Base64编码结果 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架