代码改变世界

golang 自行实现一个base64加密

  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编码结果

  

 

相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示