不知道大家以前有沒(méi)有用過(guò) / 見(jiàn)過(guò)這個(gè)玩意... 小編小時(shí)候?qū)懙囊槐竟P記一直保存到了現(xiàn)在... 當(dāng)年偷偷寫(xiě)的日記和小秘密,為了防止被同學(xué)老師家長(zhǎng)偷看,都寫(xiě)在這樣的本子里面。這種本子的密碼少則四五位,多的有七八位,除非知道這個(gè)密碼鎖的密碼,不然根本無(wú)法打開(kāi)。 上學(xué)的時(shí)候誰(shuí)又沒(méi)有在課上偷偷地傳過(guò)小紙條呢?可能很多人還挺享受那種在老師眼皮子底下偷偷摸摸說(shuō)悄悄話的快感。其實(shí)說(shuō)起來(lái),這種「?jìng)骷垪l」應(yīng)該也算是大家最早的對(duì)保密通訊的需求了。為了防止傳紙條的途中被其它同學(xué)截獲獲取里面的內(nèi)容,可能有的人還要用密碼來(lái)加密一下。 傳紙條前記得確認(rèn)一下... 從通信的角度來(lái)講,一個(gè)好的編碼方案可以在有效傳輸信息的同時(shí)大大降低傳輸所需要的代價(jià)。怎么才能科學(xué)地理解通信和編碼,以下小編將從字符編碼的角度來(lái)介紹幾種歷史上著名的編碼方案以及信息熵的概念。 摩爾斯電碼 Morse Code 1837 年,美國(guó)人塞穆?tīng)枴つ査?(Samuel Morse) 發(fā)明了電報(bào),并和艾爾菲德·維爾 (Alfred Ville) 一起,共同發(fā)明了一套電碼以供電報(bào)配套使用。這套電碼就是赫赫有名的摩爾斯電碼 (Morse alphabet)。 這種古老而簡(jiǎn)單的信號(hào)代碼主要由兩種基礎(chǔ)信號(hào)組成:短促的電信號(hào)「·」(讀作「嘀」)和保持一定時(shí)間的長(zhǎng)信號(hào)「 —」(讀作「嗒」)。電影電視劇里勤奮的發(fā)報(bào)員每天嘀嘀嗒嗒響個(gè)不停就是在發(fā)電報(bào)。 勤奮的發(fā)報(bào)員在發(fā)電報(bào) 按照點(diǎn)碼表所列出的組合,摩爾斯電碼可以構(gòu)成不同的字符,比如字母、數(shù)字和常用的標(biāo)點(diǎn)符號(hào): 摩爾斯電碼表 這些字符串連起來(lái)就組成了單詞,單詞串連變成句子。 每個(gè)不同的單位之間需要一定的停頓時(shí)間,否則就會(huì)引起歧義。比如“h”是“····”,而“i”是“··”,如果沒(méi)有停頓,連續(xù)兩個(gè)“i”就會(huì)是“····”,跟“h”就混淆了。 不同單位之間停頓的時(shí)間不相同。嘀=1t,嗒=3t,嘀嗒間=1t,字符間=3t,單詞間=7t。 簡(jiǎn)易電報(bào)機(jī) 著名的國(guó)際通用海灘求救信號(hào)就是采用摩爾斯電碼,運(yùn)用燈光(比如手電筒)向遠(yuǎn)處發(fā)射三短三長(zhǎng)三短的光,即“··· ——— ··· ”。換成對(duì)應(yīng)的字母也就是“SOS”。至于為什么要采用這樣的一組光——當(dāng)然是因?yàn)樽詈?jiǎn)單最容易辨識(shí)??! 閱后作業(yè):請(qǐng)對(duì)小編說(shuō)出以下摩爾斯電碼的解碼文: ·—·· ·· ···· ·— ·· ·—·· · ASCII 碼 ACSII Code 20世紀(jì),隨著計(jì)算機(jī)的誕生,編碼在應(yīng)用階段上獲得了迅速的發(fā)展。由于笨笨的計(jì)算機(jī)只能存儲(chǔ)二進(jìn)制數(shù)(高電平為1,低電平為0),人們決定開(kāi)發(fā)一套通用的二進(jìn)制編碼規(guī)則來(lái)相互通信。 就這樣,由美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)制定的 ASCII (美國(guó)信息交換標(biāo)準(zhǔn)代碼,American Standard Code for Information Interchange) 應(yīng)運(yùn)而生。 ASCII 碼能夠用 7 個(gè)比特來(lái)表示不同的字符。每個(gè) bit 可以有 0 和 1 兩種狀態(tài),因此 7 位二進(jìn)制數(shù)能夠表示 128 種不同的字符,也就是表中的前面 0~127 種。里面包含了所有英文文字表達(dá)所需要的字符,英文國(guó)家們表示很滿意。 但這遠(yuǎn)遠(yuǎn)不能滿足廣大的非英文國(guó)家的需求。他們表示很不開(kāi)心并增加了一個(gè)比特的位置,占領(lǐng)了后面的 128 個(gè)空位。于是,從 128 到 255 的這 128 個(gè)字符被用來(lái)表示他們的字母、符號(hào)和形狀,這些被稱為「擴(kuò)展字符集」。 圖中碼值為十進(jìn)制形式,計(jì)算機(jī)里的形式是對(duì)應(yīng)的二進(jìn)制數(shù) 即使后來(lái)產(chǎn)生了各種花里胡哨的計(jì)算機(jī)編碼規(guī)則,ASCII 碼以其優(yōu)秀的實(shí)用性,仍然保留了下來(lái)。它通常保留在各種編碼規(guī)則的最開(kāi)頭,占據(jù)最前面的 128 個(gè)位置。 在人看來(lái)非常簡(jiǎn)單的單詞,在計(jì)算機(jī)眼中就變成了一大堆 0 和 1 的組合。當(dāng)然,由于計(jì)算機(jī)擁有強(qiáng)大的處理能力,這些數(shù)字也并不成問(wèn)題。 ![]() ![]() 閱后作業(yè):參考下圖,解碼以下 ASCII 碼文(一行一字): 01101110 01101001 01101000 01100101 01101110 01111001 01101111 01110101 01111000 01101001 01110101. ![]() ![]() GBK 標(biāo)準(zhǔn) Chinese Internal Code Specification 后來(lái),計(jì)算機(jī)終于來(lái)到了中國(guó)人民的手中。然而,大家發(fā)現(xiàn) ASCII 碼的 256 個(gè)坑位已經(jīng)全部被占用了。 但漢字總不能都用拼音表示吧,廣大 l n 不分的南方人民表示不同意。。。 于是,優(yōu)秀的中國(guó)選手自己制定了一套叫做 GBK(漢字內(nèi)碼擴(kuò)展規(guī)范)的編碼方案,用兩個(gè)字節(jié)來(lái)表示一個(gè)漢字。 ![]() 對(duì)于當(dāng)時(shí)的計(jì)算機(jī)而言十分復(fù)雜的漢字 @井口皓太 這套規(guī)則兼容了前面的一些編碼方案,用后面空余的位置收錄了 21003 個(gè)漢字,日常使用完全夠夠的了~ 不過(guò),當(dāng)時(shí)想要在電腦上顯示漢字,就必須裝上一個(gè)漢字系統(tǒng)。而當(dāng)時(shí)的大多數(shù)人對(duì)電腦仍然是一竅不通的,回去裝系統(tǒng)發(fā)現(xiàn)全是 bug 而且看都看不懂。。。 ![]() 而且,不同的國(guó)家都開(kāi)發(fā)了一套自己的編碼方案和文字系統(tǒng),導(dǎo)致不同國(guó)家的人之間無(wú)法互相通信。因此他們制定了一套統(tǒng)一的編碼規(guī)則——Unicode。 ![]() Unicode 碼 Unicode Unicode 又稱萬(wàn)國(guó)碼、統(tǒng)一碼,為解決傳統(tǒng)字符編碼方案的局限而產(chǎn)生。聽(tīng)起來(lái)就很厲害有沒(méi)有! ![]() 它把所有語(yǔ)言的字符都統(tǒng)一到一套公用的編碼,有一百萬(wàn)多種字符,就像是一部世界語(yǔ)言通用字符字典。因此,在 Unicode 中,一個(gè)字符需要用三個(gè)字節(jié)來(lái)表示。 像一些簡(jiǎn)單基礎(chǔ)的字符,比如 a、b、c 等等,1 個(gè)字節(jié)就能夠表示了。但是按照 Unicode 的規(guī)則,計(jì)算機(jī)必須再讀取兩個(gè)空字節(jié)填充在高字節(jié)位。比 GBK 多 1 個(gè)字節(jié),比 ASCII 多 2 個(gè)字節(jié)。。。 所以這個(gè)神級(jí)裝備還不如新手裝備的嗎。。 ![]() 用來(lái)擴(kuò)展字符編碼的 Unicode 在處理一些簡(jiǎn)單的字符時(shí)遇到了麻煩 @葉天宇yetianyu 于是,智慧的人們不堪其辱地研發(fā)了 UTF-8 這種專門針對(duì) Unicode 的可變長(zhǎng)度編碼。它將Unicode 編碼進(jìn)行再編碼,再進(jìn)行傳輸,可以自動(dòng)變長(zhǎng)節(jié)省空間。 UTF-8 也成為現(xiàn)在程序猿們鐘愛(ài)的一種編碼形式啦~ ![]() 信息熵 Information Entropy 在上面的內(nèi)容中,我們介紹了很多編碼的內(nèi)容。但是同一份內(nèi)容,無(wú)論用什么編碼來(lái)進(jìn)行「敘述」,其本身所包含的信息應(yīng)該是不變的。 ![]() 信息,時(shí)間與知識(shí) @ alcrego 在信息論中,人們使用熵(entropy)來(lái)度量接收到的每條消息中包含的信息的平均量,這也被稱為信息熵、信源熵等。這里的「消息」其實(shí)已經(jīng)不是我們?nèi)粘0l(fā)條微信,發(fā)條語(yǔ)音的那種消息了,而是可以更廣泛地理解為一件事情發(fā)生的概率分布,或者數(shù)據(jù)中的事件、樣本或者特征。 ![]() 和熱力學(xué)里面的熵類似,這里的信息熵同樣可以理解為對(duì)不確定性的一種度量,因?yàn)橐粋€(gè)消息來(lái)源越隨機(jī),那么它的熵就越大。就像投擲一枚硬幣,其正反面出現(xiàn)的概率都相同,那么這時(shí)候它的熵就最大。反之,如果這枚硬幣很特殊,它的正面更重一些,因此在投擲以后,它正反兩面出現(xiàn)的概率不再一致,它的熵就會(huì)減小。這里的想法很簡(jiǎn)單,因?yàn)檎磧擅娓怕什辉僖恢?,這里發(fā)生了以前不會(huì)發(fā)生的事情,給我們提供了更多的信息,減少了不確定性。 ![]() 拋一枚硬幣決定生死,雖然人們總想要在消除不確定性以后往好的那一面發(fā)展,但現(xiàn)實(shí)卻不一定。。。 在很多人見(jiàn)到信息熵的定義的時(shí)候一定都會(huì)有疑惑,明明是挺簡(jiǎn)單的一個(gè)概念,為啥計(jì)算的公式這么復(fù)雜呢?又是對(duì)數(shù)又是相乘還要求和。 ![]() 信息熵計(jì)算規(guī)則 How to calculate entropy 其實(shí)藏在這個(gè)公式的背后的假設(shè)非常簡(jiǎn)單:1. 信息熵的單位。2. 可加性。 無(wú)論怎么定義信息熵,我們都需要一個(gè)單位。一般情況下我們選取的單位為 bit,比特。也就是 H2(1/2, 1/2) = 1。實(shí)際上,信息熵的定義函數(shù)對(duì)于連續(xù)性也有一定的要求。對(duì)系統(tǒng)施加微擾,假設(shè)拋一枚硬幣正面朝上的概率變?yōu)榱?0.50000001,而反面朝上的概率變?yōu)榱?0.49999999。那么此時(shí)拋硬幣這件事情包含的信息熵應(yīng)該還是約為 1 bit。而不會(huì)變成 2 bit 或者其他的數(shù)值。用數(shù)學(xué)化一點(diǎn)的語(yǔ)言來(lái)說(shuō)就是,H2(p, 1-p) 是關(guān)于 p 的連續(xù)函數(shù)。 ![]() 丟兩枚硬幣的情形 在有了信息熵的單位以后,我們還需要知道不同系統(tǒng)之間的信息熵是怎么相加的,就像小時(shí)候?qū)W加法的時(shí)候老師教小朋友 2 個(gè)蘋果加 3 個(gè)蘋果等于幾個(gè)蘋果一樣。只不過(guò)這里關(guān)于信息熵的「加法公式」,會(huì)稍微比起 2 3 = 5 麻煩一點(diǎn)點(diǎn)。 ![]() 我們需要明確不同系統(tǒng)之間的信息熵是怎么計(jì)算的 對(duì)不同系統(tǒng)的信息熵進(jìn)行求和的過(guò)程可以這么理解,還是用拋硬幣這個(gè)例子,只不過(guò)我們這時(shí)候要拋兩個(gè)硬幣了。當(dāng)然,我們希望信息熵的定義能夠保證這時(shí)候?qū)?yīng)的為 2 bit。那么能不能做到呢?我們先完全不管第一枚硬幣的正反結(jié)果,因?yàn)閷?duì)于第一枚硬幣的情況一無(wú)所知,那么這時(shí)候的系統(tǒng)其實(shí)就相當(dāng)于只拋一枚硬幣了,當(dāng)然此時(shí)的信息熵就是 1bit。此時(shí)我們?cè)賳为?dú)看第一枚硬幣帶給我們的信息熵,其同樣為 1bit。所以在信息熵的定義過(guò)程中,要讓其具有系統(tǒng)的可加性。也就是 Hm(p1...pm) = Hm(p1 p2, ...pm) p H2(p1/p, p2/p) 其中 p = p1 p2. 在有了這兩條以后,我們就能推導(dǎo)出信息熵的公式只能是上面對(duì)數(shù)的形式了。[6] ![]() 那些說(shuō)不完的秘密 Other Interesting Stories 熵的故事其實(shí)最早要從物理上開(kāi)始說(shuō)起,其度量了分子的微觀狀態(tài)的混亂程度。 ![]() 何謂「混亂」? 在信息的世界中,熵越高,其可能性越多,則能傳遞越多的信息;熵越低,其可能性越低,則能傳遞的信息越少。比如你說(shuō)了一句話,「今晚夜色真美」,里面包含了很多的可能性,熵比較高,我們一般就可以說(shuō)這句話「信息量很大」。 不過(guò)我們?nèi)粘I钪袑?duì)于信息,或者信息量很大還有另外一種理解。熵是對(duì)不確定度的度量,獲取信息等于消滅熵。就像你讀了「中科院物理所」推送的文章一樣,學(xué)到了很多東西,信息量很大。這個(gè)其實(shí)并不是說(shuō)我們文章模棱兩可,充滿了可能性,而是在說(shuō)你心里對(duì)一些事物是比較模糊的,在閱讀完文章以后,消滅了這種模糊性,獲得了信息。 回到我們前面敘述的那么多編碼中來(lái),一段數(shù)據(jù)經(jīng)過(guò)編碼以后被無(wú)損地壓縮了,信息不變,但是長(zhǎng)度變短了,這也就意味著我們更難預(yù)測(cè)每個(gè)字符的下一個(gè)字符,因此它的信息熵會(huì)增加。因?yàn)橐粋€(gè)固定長(zhǎng)度的消息其信息熵有上限,這也就是說(shuō)消息壓縮存在著上限,我們不能無(wú)限制地對(duì)消息進(jìn)行壓縮。 ![]() 如果不斷地用壓縮軟件去壓縮一個(gè)文件,我們甚至?xí)l(fā)現(xiàn)壓縮包會(huì)變得越來(lái)越大。 在信息熵的背后還有點(diǎn)小故事。在香農(nóng)提出這個(gè)概念以后,馮諾依曼發(fā)現(xiàn)了其與物理學(xué)上的熱力學(xué)熵概念存在相同之處,從而建議香農(nóng)取名為「信息熵」。不過(guò)也有傳聞?wù)f取這個(gè)名字的理由是這個(gè)熱力學(xué)名詞別人不懂,容易被唬住。[7] |
|