項目挑戰(zhàn)拓展項目之Base64編碼原理
說在前面
《浙江省普通高中學科教學指導意見》對“教學要求”的一個重要說明是“認識在真實問題活動情境中解決問題的重要教學價值,發(fā)展學生面對真實情境界定問題、抽象與建模、設計算法并解決問題的計算思維。”
將教材中的”問題與挑戰(zhàn)“、“問題與討論”、“實踐與體驗”、“思考與練習”、“項目挑戰(zhàn)”、“拓展項目”等活動合理地融入教學,使學生在真實情境中發(fā)現(xiàn)問題,借助問題的探究,發(fā)展學生對算法和程序等核心學科概念的深入理解,并掌握相關方法和技能,進一步發(fā)展計算思維,形成利用計算思維解決問題的能力。
《信息技術必修一? 數(shù)據(jù)與計算》(浙教版)第一章 項目挑戰(zhàn)中有一個拓展項目“Base64編碼”,要求學生通過閱讀素材和查閱資料,理解Base64編碼原理,并實現(xiàn)ASCII字符串與Base64編碼字符串的相互轉(zhuǎn)換。
此項目涉及到進制轉(zhuǎn)換和編碼解碼等重要知識點,雖然難度較高,但是值得廣大師生研究。對其加以簡化和改編后,更可以命制不同難度的題目。



上面是按照三個字節(jié)來舉例說明的,如果字節(jié)數(shù)不足三個,又該如何處理呢?

一個字節(jié):一個字節(jié)共8個二進制位,依舊按照規(guī)則進行分組。此時共8個二進制位,每6個一組,則第二組缺少4位,用0補齊,得到兩個Base64編碼,而后面兩組沒有對應數(shù)據(jù),都用“=”補上。因此,上圖中“A”轉(zhuǎn)換之后為“QQ==”;
兩個字節(jié):兩個字節(jié)共16個二進制位,依舊按照規(guī)則進行分組。此時總共16個二進制位,每6個一組,則第三組缺少2位,用0補齊,得到三個Base64編碼,第四組完全沒有數(shù)據(jù)則用“=”補上。因此,上圖中“BC”轉(zhuǎn)換之后為“QKM=”。
常見問題
仔細閱讀上述資料,回答下列問題:
(1)????字符”Love”的Base64編碼為多少?
(2)????若某字符的Base64編碼為”QW55”,則其原文是什么?
(3)????請編寫程序?qū)SCII字符串轉(zhuǎn)換成Base64編碼字符串。函數(shù)頭說明如下:
函數(shù)功能:將ASCII字符串轉(zhuǎn)換成Base64編碼字符串
函數(shù)名:ASCII_to_Base64(a)
參數(shù)表:a –– ASCII字符串。
返回值:Base64編碼字符串。
例1,當a ="Web"時,返回"V2Vi";
例1,當a ="A"時,返回"QQ==";
例3,當a ="AB"時,返回"QUI="。
(4)????請編寫程序?qū)ase64編碼字符串轉(zhuǎn)換成ASCII字符串。函數(shù)頭說明如下:
函數(shù)功能:將Base64編碼字符串轉(zhuǎn)換成ASCII字符串
函數(shù)名:Base64_to_ASCII(b)
參數(shù)表: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、+、/)將任意字節(jié)序列數(shù)據(jù)編碼成ASCII字符串,另有“=”符號用作后綴用途。Base64將輸入字符串按字節(jié)切分,取得每個字節(jié)對應的二進制值(若不足8比特則高位補0),然后將這些二進制數(shù)值串聯(lián)起來,再按照6比特一組進行切分(因為2^6=64),最后一組若不足6比特則末尾補0。將每組二進制值轉(zhuǎn)換成十進制,然后在上述表格中找到對應的符號并串聯(lián)起來就是Base64編碼結果。由于二進制數(shù)據(jù)是按照8比特一組進行傳輸,因此Base64按照6比特一組切分的二進制數(shù)據(jù)必須是24比特的倍數(shù)(6和8的最小公倍數(shù))。24比特就是3個字節(jié),若原字節(jié)序列數(shù)據(jù)長度不是3的倍數(shù)時且剩下1個輸入數(shù)據(jù),則在編碼結果后加2個=;若剩下2個輸入數(shù)據(jù),則在編碼結果后加1個=。''''''函數(shù)功能:將二進制字符串長度湊成n的倍數(shù),不足n位則高位補0函數(shù)名:to_Byte(bc, n)參數(shù)表:bc –– 二進制字符串;n –– 每組字符串的長度;返回值:高位補0后的二進制字符串,其長度位n的倍數(shù)。例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數(shù)量,也可以寫成(n - len(bc)) % nans = '0' * mreturn ans + bc'''函數(shù)功能:將ASCII字符串轉(zhuǎn)換成Base64編碼字符串函數(shù)名:ASCII_to_Base64(a)參數(shù)表: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 數(shù)值bc = to_Byte(bin(ac)[2:], 8) #將二進制字符串湊成整數(shù)個字節(jié)bite_code.append(bc)bite_code = "".join(bite_code) #拼接成二進制字符串n = len(bite_code) #二進制字符串長度ans = []c = 0while c + 24 <= n: #24位一組group = bite_code[c:c+24] #24位二進制數(shù)for k in range(0, 24, 6):i = int(group[k:k+6], 2)ans.append(Base64[i]) #轉(zhuǎn)換成Base64編碼c += 24m = (n - c)//8 #剩余字節(jié)數(shù)量,取值為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)]) #缺失字節(jié)補上=return "".join(ans)'''函數(shù)功能:將Base64編碼字符串轉(zhuǎn)換成ASCII字符串函數(shù)名:Base64_to_ASCII(b)參數(shù)表:b –– Base64編碼字符串。返回值:ASCII字符串。例1,當b = "V2Vi"時,返回"Web";例1,當b = "QQ=="時,返回"A";例3,當b = "QUI="時,返回"AB"。'''def Base64_to_ASCII(b):pass #此處代碼就作為課后練習吧#主函數(shù)部分#創(chuàng)建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算法之旅”知識星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注Python算法,感興趣就一起來!
相關優(yōu)秀文章:
