二进制编码转ASCII字符与字符转二进制码的小解码器、编码器
??????
文章目錄
前言
一、ASCII碼及其它編碼發(fā)展的介紹
二、解決方案
1.解碼ASCII編碼
程序運(yùn)行演示:
Logic will get you from A to B. Imagination will take you everywhere.
2.編碼ASCII碼
總結(jié)
前言
?這罪惡的根源在于一個(gè)題目......害!!!!
我靠,嘖嘖嘖.....這么一串是個(gè)啥?
?原來啊,這是一串8位二進(jìn)制表示的ASCII編碼!
一、ASCII碼及其它編碼發(fā)展的介紹
由于計(jì)算機(jī)是美國人發(fā)明的,因此,最早只有127個(gè)字母被編碼到計(jì)算機(jī)里,也就是大小寫英文字母、數(shù)字和一些符號(hào),這個(gè)編碼表被稱為ASCII編碼,比如大寫字母?A的編碼是65,小寫字母?z的編碼是122。后128個(gè)稱為擴(kuò)展ASCII碼。
ASCII編碼:
空格(0)對(duì)應(yīng)的ASCII碼就是是0;對(duì)勾(251)對(duì)應(yīng)的ASCII碼是11111011。如果我們想要表示一個(gè)空格+對(duì)勾,那么就是0+11111011,但是放在一起就是011111011,該怎樣”斷句“呢?顯然出現(xiàn)了混亂,故而:?
由于編碼表中最多255個(gè)字符,所以人們想到了用八位二進(jìn)制來表示這些字符。比如A(65)對(duì)應(yīng)的二進(jìn)制碼就是1000001,不足8位在前面補(bǔ)0,所以01000001。所以空格+對(duì)勾就可以表示為0000000011111011,讀取的時(shí)候每八位讀取一個(gè)字符即可。
2.GB2312 & GBK(中國人自己的編碼)
很顯然,ASCII編碼只能顯示英文,不能顯示漢字,美國佬當(dāng)年在造計(jì)算機(jī)的時(shí)候肯定也沒想到,中國人有一天也會(huì)用上計(jì)算機(jī),上世界80年代,電腦進(jìn)入中國,專家們是頭疼啊!我中華文化博大精深,光常用漢字就有幾千個(gè),你一張ASCII編碼表也裝不了啊,但是但是,我們中國人從來不怕困難,沒有我們就自己造唄,于是,GB2312(存了6763個(gè)漢字)就誕生了!
?后來,在1995年,專家們又升級(jí)了GB2312,也就是現(xiàn)在windows電腦中文版本的編碼:GBK.
?3.Unicode(萬國碼)
在計(jì)算機(jī)高速發(fā)展的那個(gè)年代,各個(gè)國家都在發(fā)展屬于自己的編碼,中國的GB2312,日本的Shift_JIS,韓國的Euc-kr,于是啊,問題就出現(xiàn)了,你GB2312編寫的代碼在日本的終端上不能運(yùn)行,是一堆亂碼,這就是編碼的混戰(zhàn)時(shí)代,這可咋整呢?后來是聯(lián)合國調(diào)解,統(tǒng)一了所有的語言,將其放在了Unicode里,這就是萬國碼的由來!
二、解決方案
1.解碼ASCII編碼
其實(shí)要實(shí)現(xiàn)ASCII編碼的解碼是很簡(jiǎn)單的,首先,需要將8位二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),再利用python自帶的chr函數(shù)將十進(jìn)制數(shù)轉(zhuǎn)為ASCII編碼表中對(duì)應(yīng)的字符就行了!
代碼如下:
print("歡迎使用mc開發(fā)的程序!".center(50, '*'),"\n") # 本人的個(gè)性標(biāo)簽 print("請(qǐng)輸入你需要解碼的code:") a = input("code:") li = list(a) # 先將需要轉(zhuǎn)譯的編碼由8位二進(jìn)制碼轉(zhuǎn)為列表,便于后面程序的操作 b = [] # 空列表b用于存放解碼出來的字符串 m = 0 n = 7 while n <= len(li):x = li[m:n+1:1] # 將列表進(jìn)行切片處理b.append(x)m += 9n += 9 # 此處用到算法是為了將空格給去掉,每8位跳一次 print(b,len(b)) # 打印b,看看是否出現(xiàn)錯(cuò)誤,此處已經(jīng)實(shí)驗(yàn)過,需要的話請(qǐng)取消注釋 for i in range(len(b)):print(len(b[i]),end="") print('\n') print("Please judge it's True or False by 8888......always") # 判斷是否出現(xiàn)錯(cuò)誤,保證每一個(gè)元素b[i]都是8位二進(jìn)制數(shù)以免后面轉(zhuǎn)譯的時(shí)候出錯(cuò) print("\n") print("破譯成功***你所破譯的編碼意思是:") # 定義一個(gè)進(jìn)制轉(zhuǎn)換并輸出ASCII字符函數(shù) def two_translate_ten(x):i = 0sum = 0while i <= 7:sum += int(x[i]) * 2**(7-i)i += 1print(chr(sum),end="") # 將10進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)的ASCII字符并無換行輸出return 0 j = 0 while j <= len(b)-1:x = b[j]two_translate_ten(x)j += 1 # 循環(huán)調(diào)用 two_translate_ten(x)函數(shù) print("\n") print("感謝使用mc開發(fā)的程序!".center(60, '*')) print("\n") # for k in range(len(b)): # two_translate_ten(b[k]) # 此處代碼存在一定的問題,在于切片后的列表內(nèi)還是一個(gè)個(gè)小的列表,如果要調(diào)用這些小列表里面的數(shù)據(jù),就需要進(jìn)行賦值轉(zhuǎn)換
程序運(yùn)行演示:
*******************歡迎使用mc開發(fā)的程序!******************* 請(qǐng)輸入你需要解碼的code: # 這里直接復(fù)制粘貼所需要解碼的代碼就行了
code:01001100 01101111 01100111 01101001 01100011 00100000 01110111 01101001 01101100 01101100 00100000 01100111 01100101 01110100 00100000 01111001 01101111 01110101 00100000 01100110 01110010 01101111 01101101 00100000 01000001 00100000 01110100 01101111 00100000 01000010 00101110 00100000 01001001 01101101 01100001 01100111 01101001 01101110 01100001 01110100 01101001 01101111 01101110 00100000 01110111 01101001 01101100 01101100 00100000 01110100 01100001 01101011 01100101 00100000 01111001 01101111 01110101 00100000 01100101 01110110 01100101 01110010 01111001 01110111 01101000 01100101 01110010 01100101 00101110
888888888888888888888888888888888888888888888888888888888888888888888Please judge it's True or False by 8888......always破譯成功***你所破譯的編碼意思是:
Logic will get you from A to B. Imagination will take you everywhere.************************感謝使用mc開發(fā)的程序!************************
Logic will get you from A to B. Imagination will take you everywhere.
(邏輯會(huì)帶你從A到B,想象會(huì)帶你到任何地方)
顯然,這就是一開始我們提到的那個(gè)題目的答案了!
在這個(gè)代碼中我們需要注意的是題目給出的代碼每8位間是有一個(gè)空格的,所以在必須將空格去掉,用列表的切片功能就可以實(shí)現(xiàn)了!
2.編碼ASCII碼
其實(shí)這個(gè)設(shè)計(jì)是當(dāng)時(shí)在寫完上一個(gè)編碼后突發(fā)奇想想要實(shí)現(xiàn)的!既然我能夠?qū)⒁欢蜛SCII編碼解碼為一段英文輸出,那么我也一定能夠?qū)⒁欢斡⑽木幋a為一段ASCII編碼啦!
代碼如下:
print("歡迎使用mc開發(fā)的程序!".center(50, '*')) # 本人的個(gè)性標(biāo)簽 print("Please write your code:") x = input("code:") i = 0 st = [] # 定義一個(gè)10進(jìn)制轉(zhuǎn)二進(jìn)制的函數(shù) def two_transfer(x):a = []while x != 0:a.append(x%2)x =int(x/2)a.reverse()while len(a) != 8:a.insert(0,0) # 避免二進(jìn)制數(shù)不滿足8位碼的要求,需要在二進(jìn)制碼前面補(bǔ)0st.append(a)print(a)return st # 返回st,用于后面的調(diào)用 while i <= len(x)-1:y = ord(x[i]) # 轉(zhuǎn)為十進(jìn)制數(shù)two_transfer(y) # 調(diào)用10進(jìn)制轉(zhuǎn)二進(jìn)制函數(shù),將10進(jìn)制轉(zhuǎn)為2進(jìn)制數(shù)i += 1 print("\n") print("Translating your words into codes is successful,it's (你的代碼已編譯成功):") print("\n") for k in st:k.insert(8,' ') # 加空格for i in range(len(k)):print ("".join(str(k[i])),end='') # 將‘’去掉后輸出 print("\n") print("\n","感謝使用mc開發(fā)的程序!".center(60, '*'))為了實(shí)現(xiàn)能夠與前面的解碼程序相兼容,這里我們用了.insert (8,' ')插入了一個(gè)空格
下面我們以編碼歌曲《Star Sky》歌詞為例:“Here we are !Riding the sky,Painting the night with sun,You and I, Mirrors of light,Twin flames of fire,Lit in another time and place,I knew your name,I knew your face,Your love and grace,Past and present now embrace,Worlds collide in inner space,Unstoppable, the song we play!”
代碼運(yùn)行情況:
*******************歡迎使用mc開發(fā)的程序!******************* Please write your code: code:Here we are !Riding the sky,Painting the night with sun,You and I, Mirrors of light,Twin flames of fire,Lit in another time and place,I knew your name,I knew your face,Your love and grace,Past and present now embrace,Worlds collide in inner space,Unstoppable, the song we playTranslating your words into codes is successful,it's (你的代碼已編譯成功):01001000 01100101 01110010 01100101 00100000 01110111 01100101 00100000 01100001 01110010 01100101 00100000 00100001 01010010 01101001 01100100 01101001 01101110 01100111 00100000 01110100 01101000 01100101 00100000 01110011 01101011 01111001 00101100 01010000 01100001 01101001 01101110 01110100 01101001 01101110 01100111 00100000 01110100 01101000 01100101 00100000 01101110 01101001 01100111 01101000 01110100 00100000 01110111 01101001 01110100 01101000 00100000 01110011 01110101 01101110 00101100 01011001 01101111 01110101 00100000 01100001 01101110 01100100 00100000 01001001 00101100 00100000 01001101 01101001 01110010 01110010 01101111 01110010 01110011 00100000 01101111 01100110 00100000 01101100 01101001 01100111 01101000 01110100 00101100 01010100 01110111 01101001 01101110 00100000 01100110 01101100 01100001 01101101 01100101 01110011 00100000 01101111 01100110 00100000 01100110 01101001 01110010 01100101 00101100 01001100 01101001 01110100 00100000 01101001 01101110 00100000 01100001 01101110 01101111 01110100 01101000 01100101 01110010 00100000 01110100 01101001 01101101 01100101 00100000 01100001 01101110 01100100 00100000 01110000 01101100 01100001 01100011 01100101 00101100 01001001 00100000 01101011 01101110 01100101 01110111 00100000 01111001 01101111 01110101 01110010 00100000 01101110 01100001 01101101 01100101 00101100 01001001 00100000 01101011 01101110 01100101 01110111 00100000 01111001 01101111 01110101 01110010 00100000 01100110 01100001 01100011 01100101 00101100 01011001 01101111 01110101 01110010 00100000 01101100 01101111 01110110 01100101 00100000 01100001 01101110 01100100 00100000 01100111 01110010 01100001 01100011 01100101 00101100 01010000 01100001 01110011 01110100 00100000 01100001 01101110 01100100 00100000 01110000 01110010 01100101 01110011 01100101 01101110 01110100 00100000 01101110 01101111 01110111 00100000 01100101 01101101 01100010 01110010 01100001 01100011 01100101 00101100 01010111 01101111 01110010 01101100 01100100 01110011 00100000 01100011 01101111 01101100 01101100 01101001 01100100 01100101 00100000 01101001 01101110 00100000 01101001 01101110 01101110 01100101 01110010 00100000 01110011 01110000 01100001 01100011 01100101 00101100 01010101 01101110 01110011 01110100 01101111 01110000 01110000 01100001 01100010 01101100 01100101 00101100 00100000 01110100 01101000 01100101 00100000 01110011 01101111 01101110 01100111 00100000 01110111 01100101 00100000 01110000 01101100 01100001 01111001 ************************感謝使用mc開發(fā)的程序!************************可以看到我們已經(jīng)能夠?qū)⒁欢斡⑽霓D(zhuǎn)換為ASCII編碼啦!
?并且每8位一個(gè)字符,空格隔開,可以與解碼程序相容,感興趣的讀者可以嘗試一下。
示范:
*******************歡迎使用mc開發(fā)的程序!******************* 請(qǐng)輸入你需要解碼的code: code:01001000 01100101 01110010 01100101 00100000 01110111 01100101 00100000 01100001 01110010 01100101 00100000 00100001 01010010 01101001 01100100 01101001 01101110 01100111 00100000 01110100 01101000 01100101 00100000 01110011 01101011 01111001 00101100 01010000 01100001 01101001 01101110 01110100 01101001 01101110 01100111 00100000 01110100 01101000 01100101 00100000 01101110 01101001 01100111 01101000 01110100 00100000 01110111 01101001 01110100 01101000 00100000 01110011 01110101 01101110 00101100 01011001 01101111 01110101 00100000 01100001 01101110 01100100 00100000 01001001 00101100 00100000 01001101 01101001 01110010 01110010 01101111 01110010 01110011 00100000 01101111 01100110 00100000 01101100 01101001 01100111 01101000 01110100 00101100 01010100 01110111 01101001 01101110 00100000 01100110 01101100 01100001 01101101 01100101 01110011 00100000 01101111 01100110 00100000 01100110 01101001 01110010 01100101 00101100 01001100 01101001 01110100 00100000 01101001 01101110 00100000 01100001 01101110 01101111 01110100 01101000 01100101 01110010 00100000 01110100 01101001 01101101 01100101 00100000 01100001 01101110 01100100 00100000 01110000 01101100 01100001 01100011 01100101 00101100 01001001 00100000 01101011 01101110 01100101 01110111 00100000 01111001 01101111 01110101 01110010 00100000 01101110 01100001 01101101 01100101 00101100 01001001 00100000 01101011 01101110 01100101 01110111 00100000 01111001 01101111 01110101 01110010 00100000 01100110 01100001 01100011 01100101 00101100 01011001 01101111 01110101 01110010 00100000 01101100 01101111 01110110 01100101 00100000 01100001 01101110 01100100 00100000 01100111 01110010 01100001 01100011 01100101 00101100 01010000 01100001 01110011 01110100 00100000 01100001 01101110 01100100 00100000 01110000 01110010 01100101 01110011 01100101 01101110 01110100 00100000 01101110 01101111 01110111 00100000 01100101 01101101 01100010 01110010 01100001 01100011 01100101 00101100 01010111 01101111 01110010 01101100 01100100 01110011 00100000 01100011 01101111 01101100 01101100 01101001 01100100 01100101 00100000 01101001 01101110 00100000 01101001 01101110 01101110 01100101 01110010 00100000 01110011 01110000 01100001 01100011 01100101 00101100 01010101 01101110 01110011 01110100 01101111 01110000 01110000 01100001 01100010 01101100 01100101 00101100 00100000 01110100 01101000 01100101 00100000 01110011 01101111 01101110 01100111 00100000 01110111 01100101 00100000 01110000 01101100 01100001 01111001 888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888Please judge it's True or False by 8888......always破譯成功***你所破譯的編碼意思是: Here we are !Riding the sky,Painting the night with sun,You and I, Mirrors of light,Twin flames of fire,Lit in another time and place,I knew your name,I knew your face,Your love and grace,Past and present now embrace,Worlds collide in inner space,Unstoppable, the song we play************************感謝使用mc開發(fā)的程序!************************Process finished with exit code 0?編碼與解碼程序是相兼容的!
結(jié)語
這個(gè)問題到此就算是解決了!害....!!!真不容易啊!
OK,有問題可以留言詢問哦!
總結(jié)
以上是生活随笔為你收集整理的二进制编码转ASCII字符与字符转二进制码的小解码器、编码器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串处理问题[2]:将一个数字型…
- 下一篇: 在IBM服务器安装Windows ser