<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          項目挑戰(zhàn)拓展項目之Base64編碼原理

          共 3570字,需瀏覽 8分鐘

           ·

          2022-03-05 16:15

          說在前面

          《浙江省普通高中學科教學指導意見“教學要求”的一個重要說明是認識在真實問題活動情境中解決問題的重要教學價值,發(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)) % n ans = '0' * m return 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 = 0 while 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 += 24 m = (n - c)//8 #剩余字節(jié)數(shù)量,取值為1或2 if 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)秀文章:

          閱讀代碼和寫更好的代碼

          最有效的學習方式

          Python算法之旅文章分類

          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久久欧美二区电影网 | 99视频在线观看视频 | 操屄视频免费 | 超碰免费人妻 | 大香蕉凹凸视频 |