base64编码和解码

你的名字 2022-02-13 04:47 500阅读 0赞

base64编码和解码

  • 原理

    1. 计算机中,每个字节是8位的二进制数
    2. base64编码中,每一个8位的二进制数中只有后6位时有效字节,其他用0填充。
    3. 正常编码转成base64编码,满足3 * 8 = 24 = 4 * 6。即每3个字节的正常编码可以转成由4个字节组成的正常编码。
  • base64编码表 base64\_001

编码图解:(参考维基百科)

  • 3位的字节转成4位的base64字节
    base64\_002
  • 2位的字节转成4位的base64字节,注意:补等号=
    base64\_003
  • 1位的字节转成4位的base64字节,注意:补等号
    base64\_004

简单代码实现Python例子

  1. def xdd_base64():
  2. """ base64,编码和解码 :return: """
  3. strbase64 = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  4. dictbase64 = { k:i for i,k in enumerate(strbase64)}
  5. dictbase64[b"="[0]] = 0
  6. def base64Encode(stt:str)->bytes:# 编码
  7. """ base64 编码,将字符串转成 base64格式的字符串 :param stt: :return: """
  8. bstt = stt.encode(encoding="utf-8")
  9. # print(bstt,"====")
  10. k = 0
  11. count = len(bstt)
  12. barr = bytearray()
  13. for i in range(3,count,3): #3*8=4*6
  14. units = bstt[k:i]
  15. barr.extend(getBytearry(units))
  16. k = i
  17. else:
  18. if k<count: #最后字节数不够3个字节。补0
  19. num = k-count+3
  20. endunits = bstt[k:] +b"\x00"*num #长度不够补0
  21. barr.extend(getBytearry(endunits))
  22. if num : barr[-num:] = b"=" * num #末尾补等号
  23. # print(endunits)
  24. return bytes(barr)
  25. def getBytearry(nuits:bytes)->bytearray:
  26. """ 将3个8位的字节,转成4个6位的字节 :param nuits: :return: """
  27. barr = []
  28. barrint = int.from_bytes(nuits,'big')
  29. for i in range(18,-1,-6):
  30. # 注意0x3F是16精制数,对应二精制数是11 1111 对应10进制数是63,与6个1的二进制数做与运算,相当于支取最后6个二进制数
  31. barr.append(strbase64[barrint>>i if i==18 else barrint>>i & 0x3F])
  32. return barr
  33. def base64Decode(stt:bytes)->bytes: #解码
  34. strarr = (stt[i-4:i] for i in range(4,len(stt)+1,4))
  35. arrby = bytearray()
  36. num = 0
  37. for nuits in strarr:
  38. rint = 0
  39. for k in nuits:
  40. if k == b"="[0]: num +=1 #统计尾部等号个数
  41. rint = (rint << 6) + dictbase64[k]
  42. arrby.extend(rint.to_bytes(3,"big"))
  43. while num: #去除尾部0字符
  44. arrby.pop()
  45. num -= 1
  46. return bytes(arrby)
  47. xdd_base64.encode = base64Encode
  48. xdd_base64.decode = base64Decode
  49. return xdd_base64
  • 调用验证:

    import base64
    stt = [“a”,”`”,’ab’,’abc’,’abcd’,’ManMa’,”教育a”]
    for s in stt:

    1. xddbase = xdd_base64()
    2. destr = xddbase.encode(s)
    3. sysb64 = base64.b64encode(s.encode())
    4. print("base64编码:\t{}\t\t系統base64:\t{}".format(destr,sysb64))
    5. enstr = xddbase.decode(destr)
    6. print("base64解码:\t{}\t\t系統base64:\t{}".format(enstr,base64.b64decode(sysb64)))
    7. print()

base64\_005

java实现base64编码:

  1. package com.gdy.wts;
  2. import java.util.Base64;
  3. public class text3 {
  4. /** * @param args */
  5. public static void main(String[] args) {
  6. String[] text = { "a","`","ab","abc","abcd"};
  7. for(String str :text){
  8. byte[] sysencode = Base64.getEncoder().encode(str.getBytes());
  9. System.out.println("系統base64编码为:\t"+ new String(sysencode));
  10. System.out.println("base64encode编码为:\t"+ new String(base64Encode(str)));
  11. }
  12. }
  13. private static final char[] toBase64 = {
  14. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
  15. 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
  16. 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
  17. 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
  18. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
  19. };
  20. /** * base64编码 * @param str 需要编码的字符串 * @return byte[] base64编码 */
  21. public static byte[] base64Encode(String str){
  22. byte[] bstr = str.getBytes();
  23. int mo = bstr.length%3;
  24. byte[] b64 = new byte[(mo==0?str.length()/3:str.length()/3+1)*4];
  25. int b64index = 0;
  26. int i=2;
  27. for(;i<bstr.length;i+=3){
  28. int temp = bstr[i-2]<<16 | bstr[i-1]<<8 | bstr[i];
  29. b64[b64index++] = (byte)toBase64[ temp>>18];
  30. b64[b64index++] = (byte)toBase64[ (temp>>12) & 0x3f];
  31. b64[b64index++] = (byte)toBase64[ (temp>>6) & 0x3f];
  32. b64[b64index++] = (byte)toBase64[temp & 0x3f];
  33. }
  34. if(mo!=0){
  35. int temp = 0;
  36. //补0
  37. for(int k=1;k<=mo;k++){
  38. temp |= bstr[i-3+k]<<(8*(3-k));
  39. }
  40. b64[b64index++] = (byte)toBase64[ temp>>18];
  41. b64[b64index++] = (byte)toBase64[ (temp>>12) & 0x3f];
  42. b64[b64index++] = (byte)toBase64[ (temp>>6) & 0x3f];
  43. b64[b64index++] = (byte)toBase64[temp & 0x3f];
  44. //替换等号
  45. for(int k=1;k<=3-mo;k++){
  46. b64[b64.length-k] = '=';
  47. }
  48. }
  49. return b64;
  50. }
  51. }
  • 运行结果如下:
    base64\_006

发表评论

表情:
评论列表 (有 0 条评论,500人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Base64编码解码算法

    Base64不是什么新奇的算法了,不过如果你没从事过页面开发(或者说动态页面开发,尤其是邮箱服务),你都不怎么了解过,只是听起来很熟悉。 对于黑客来说,Base64与MD5算

    相关 BASE64编码解码

    BASE64,是一种公共编解码算法 大家都是遵循同一种算法来对字节数组进行编解码,所以可以通用. java在很多公共的框架中都有BASE64的实现. 可以用: A