您的位置:首页 >聚焦 >

项目挑战拓展项目之Base64编码原理

2022-03-05 17:01:09    来源:程序员客栈

说在前面

《浙江省普通高中学科教学指导意见》对“教学要求”的一个重要说明是“认识在真实问题活动情境中解决问题的重要教学价值,发展学生面对真实情境界定问题、抽象与建模、设计算法并解决问题的计算思维。”

将教材中的”问题与挑战“、“问题与讨论”、“实践与体验”、“思考与练习”、“项目挑战”、“拓展项目”等活动合理地融入教学,使学生在真实情境中发现问题,借助问题的探究,发展学生对算法和程序等核心学科概念的深入理解,并掌握相关方法和技能,进一步发展计算思维,形成利用计算思维解决问题的能力。

《信息技术必修一 数据与计算》(浙教版)第一章 项目挑战中有一个拓展项目“Base64编码”,要求学生通过阅读素材和查阅资料,理解Base64编码原理,并实现ASCII字符串与Base64编码字符串的相互转换。

此项目涉及到进制转换和编码解码等重要知识点,虽然难度较高,但是值得广大师生研究。对其加以简化和改编后,更可以命制不同难度的题目。

素材展示

上面是按照三个字节来举例说明的,如果字节数不足三个,又该如何处理呢?

一个字节:一个字节共8个二进制位,依旧按照规则进行分组。此时共8个二进制位,每6个一组,则第二组缺少4位,用0补齐,得到两个Base64编码,而后面两组没有对应数据,都用“=”补上。因此,上图中“A”转换之后为“QQ==”;

两个字节:两个字节共16个二进制位,依旧按照规则进行分组。此时总共16个二进制位,每6个一组,则第三组缺少2位,用0补齐,得到三个Base64编码,第四组完全没有数据则用“=”补上。因此,上图中“BC”转换之后为“QKM=”。

常见问题

仔细阅读上述资料,回答下列问题:

(1)字符”Love”的Base64编码为多少?

(2)若某字符的Base64编码为”QW55”,则其原文是什么?

(3)请编写程序将ASCII字符串转换成Base64编码字符串。函数头说明如下:

函数功能:将ASCII字符串转换成Base64编码字符串

函数名:ASCII_to_Base64(a)

参数表:a –– ASCII字符串。

返回值:Base64编码字符串。

例1,当a ="Web"时,返回"V2Vi";

例1,当a ="A"时,返回"QQ==";

例3,当a ="AB"时,返回"QUI="。

(4)请编写程序将Base64编码字符串转换成ASCII字符串。函数头说明如下:

函数功能:将Base64编码字符串转换成ASCII字符串

函数名:Base64_to_ASCII(b)

参数表:b –– Base64编码字符串。

返回值:ASCII字符串。

例1,当b ="V2Vi"时,返回"Web";

例1,当b ="QQ=="时,返回"A";

例3,当b ="QUI="时,返回"AB"。

参考代码

#!/usr/bin/python3# 文件名: Base64编码# 作者:巧若拙#时间:2022-3-1"""描述:Base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途。Base64将输入字符串按字节切分,取得每个字节对应的二进制值(若不足8比特则高位补0),然后将这些二进制数值串联起来,再按照6比特一组进行切分(因为2^6=64),最后一组若不足6比特则末尾补0。将每组二进制值转换成十进制,然后在上述表格中找到对应的符号并串联起来就是Base64编码结果。由于二进制数据是按照8比特一组进行传输,因此Base64按照6比特一组切分的二进制数据必须是24比特的倍数(6和8的最小公倍数)。24比特就是3个字节,若原字节序列数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=。""""""函数功能:将二进制字符串长度凑成n的倍数,不足n位则高位补0函数名:to_Byte(bc, n)参数表:bc –– 二进制字符串;n –– 每组字符串的长度;返回值:高位补0后的二进制字符串,其长度位n的倍数。例1,当bc="101010101010",n=8时,返回"0000101010101010";例1,当bc="11010",n=6时,返回"011010";例3,当bc="110100",n=6时,返回"110100"。"""def to_Byte(bc, n):m = (n - len(bc) % n) % n #前缀0数量,也可以写成(n - len(bc)) % nans = "0" * mreturn ans + bc"""函数功能:将ASCII字符串转换成Base64编码字符串函数名:ASCII_to_Base64(a)参数表:a –– ASCII字符串。返回值:Base64编码字符串。例1,当a = "Web"时,返回"V2Vi";例1,当a = "A"时,返回"QQ==";例3,当a = "AB"时,返回"QUI="。"""def ASCII_to_Base64(a):bite_code = [] #用来存储二进制位for ch in a:ac = ord(ch) #ASCII 数值bc = to_Byte(bin(ac)[2:], 8) #将二进制字符串凑成整数个字节bite_code.append(bc)bite_code = "".join(bite_code) #拼接成二进制字符串n = len(bite_code) #二进制字符串长度ans = []c = 0 while c + 24 <= n: #24位一组group = bite_code[c:c+24] #24位二进制数for k in range(0, 24, 6):i = int(group[k:k+6], 2)ans.append(Base64[i]) #转换成Base64编码c += 24m = (n - c)//8 #剩余字节数量,取值为1或2if m > 0:group = bite_code[c:] + "00" * (3-m)for k in range(0, 6*(m+1), 6):i = int(group[k:k+6], 2)ans.append(Base64[i])ans.extend(["="*(3-m)]) #缺失字节补上=return "".join(ans)"""函数功能:将Base64编码字符串转换成ASCII字符串函数名:Base64_to_ASCII(b)参数表:b –– Base64编码字符串。返回值:ASCII字符串。例1,当b = "V2Vi"时,返回"Web";例1,当b = "QQ=="时,返回"A";例3,当b = "QUI="时,返回"AB"。"""def Base64_to_ASCII(b):pass #此处代码就作为课后练习吧#主函数部分#创建Base64编码表Base64 = [chr(ord("A")+i) for i in range(26)]Base64 += [chr(ord("a")+i) for i in range(26)]Base64 += [chr(ord("0")+i) for i in range(10)]Base64 += ["+","/"]#测试代码p = "A"b = ASCII_to_Base64(p)a = Base64_to_ASCII(b)print(p, b, a)p = "AB"b = ASCII_to_Base64(p)a = Base64_to_ASCII(b)print(p, b, a)p = "Web"b = ASCII_to_Base64(p)a = Base64_to_ASCII(b)print(p, b, a)p = "Love"b = ASCII_to_Base64(p)a = Base64_to_ASCII(b)print(p, b, a)print("QW55",Base64_to_ASCII("QW55"))

需要本文PPT、源代码和课后练习答案的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!

相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

Python算法之旅文章分类

关键词: 二进制字符 函数功能 二进制位

相关阅读