什么是base64


个人理解
base64就是将字符按3个字节进行分割,然后将二进制分为6bit一段,6bit最大表示数为64,所以形成base64。

字符串: abc
ASCII:97 98 99
二进制:
    a => 0110 0001
    b => 0110 0010
    c => 0110 0011
组合起来是: 01100001 01100010 0110 0011
六位分段:   011000 010110 001001 100011
对应数字为: 24     22     9      35
base64表:    Y      W      J      k

Base64编码表

代码

  def test(src):
    alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy0123456789+/'
    ret = bytearray()
    length = len(src)
    r = 0
    for offset in range(0, length, 3):
        if offset + 3 <= length:
            triple = src[offset:offset + 3]
        else:
            triple = src[offset:]
            r = 3 - len(triple)
            triple = triple + '\x00' * r
            # '\x00' 就是ASCII对应的0

        # abc = > 0x616263   # 大端模式 0x616263 => 61 62 63   => a b c
        b = int.from_bytes(triple.encode(), 'big')  # 大端模式big,小端为little
        # from_bytes 将 byte 转为 int 类型
        # b 0x616263  大端模式
        # print(hex(b))
        # b的状态为   01100001 01100010 01100011  # abc
        # 六位断开 011000 010110 001001 100011
        for i in range(18, -1, -6):
            # 步进为-6 分别是 18 12 6 0
            if i == 18:
                # 如果是18 b就移动18位
                # 011000 010110 001001 100011
                # 000000 000000 000000 011000 移位后的结果 只剩下最左边的那一段了
                index = b >> i
            else:
                # i = 12
                # 011000 010110 001001 100011
                # 000000 000000 011000 010110  移位后结果
                index = b >> i & 0x3F
                # & 位运算符,二进制同为1结果为1,否则为0
                # 0x3F = 0b0011 1111 = 111111   #这里表示只保留最后六位
            ret.append(alphabet[index])
        for i in range(1, r + 1):
            ret[-i] = 0x3D
    return ret


a = test(src='a')
print(a)

  def test(src):
    alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy0123456789+/'
    ret = bytearray()
    length = len(src)
    r = 0
    for offset in range(0, length, 3):
        if offset + 3 <= length:
            triple = src[offset:offset + 3]
        else:
            triple = src[offset:]
            r = 3 - len(triple)
            triple = triple + '\x00' * r
            # '\x00' 就是ASCII对应的0

        # abc = > 0x616263   # 大端模式 0x616263 => 61 62 63   => a b c
        b = int.from_bytes(triple.encode(), 'big')  # 大端模式big,小端为little
        # from_bytes 将 byte 转为 int 类型
        # b 0x616263  大端模式
        # print(hex(b))
        # b的状态为   01100001 01100010 01100011  # abc
        # 六位断开 011000 010110 001001 100011
        for i in range(18, -1, -6):
            # 步进为-6 分别是 18 12 6 0
            index = b >> i & 0x3F
            # 每次多做一次位与运算,当i为18的时候,位与运算不会影响结果
            ret.append(alphabet[index])
        for i in range(1, r + 1):
            ret[-i] = 0x3D
    return ret


a = test(src='a')
print(a)

Last modification:June 18th, 2020 at 04:26 pm
If you think my article is useful to you, please feel free to appreciate