**:《編碼的奧秘》 第一章
假若你才 1 0歲,你的好朋友與你臨街而住,而且你們臥室的窗戶面對著面 。每天晚上,當父母像平常一樣很早催你**睡覺時,你可能還想與好朋友交流思想、發現、小秘密、傳聞、笑話和夢想,沒有人可以責備你,畢竟 ,渴望交流是大多數人的天性。當你們臥室還亮著燈時,你和你的好朋友可以臨窗舞動手臂、打手勢或以身體語言來交流思想,但複雜一些的交流
就有些困難了。而且一旦父母宣布「熄燈」,交流也就無法繼續進行了。
如何聯絡呢?用**嗎? 10歲的小孩子屋裡有**嗎?即使有,你們的談話可能被偷聽。如果家裡的電腦通過**線聯了網,它可能會提供無聲的幫助,不過很不幸,它也不會在你的房間裡。
你和朋友採用的方法是用手電筒。所有的人都知道手電筒是為孩子們藏在被窩裡看書而發明的,它也適合在黑暗中用來交流。它無聲無息,且光的方向性很好,不會從臥室的門縫中洩露而使家人起疑。
用手電筒的光可以交談嗎?這值得一試。一年級你就學過在紙上寫字母和單詞,把這種方法運用到手電筒上看起來也合情合理。你所需做的就是臨窗而站,用光畫出字母。畫字母『 o』 ,就開啟電筒,在空中畫個圈,然後關上開關;字母『 i』則是畫豎直的一筆。但是你很快發現這種方法行不通,當你注視來去飛舞的光柱時,會發現在腦海中將它們組合起來不是件容易的事,這些光劃成的圈圈槓槓太不準確了。
也許你曾經看過一部電影,影片中兩個水手隔海用閃爍的光傳遞訊息。在另一部電影中,乙個間諜用鏡子反射陽光向一間屋子中被俘獲的同夥傳送訊息。這就給了你啟發,你起先設計一種簡單的交流方法,使字母表中的每個字母與一定數目的閃爍相對應。 a閃一下, b閃兩下, c閃三下,如此遞推, z就閃爍 2 6下。 b a d這個詞由字母間有間隔的兩閃、一閃、四閃組成,這樣你不會誤以為它是閃七下的字母 g了。詞間的停頓則比字母間的停頓時間稍長一些。這看起來很有希望,採用這種方法的優點是你不需要在空中揮舞手電簡,只需對準方向按開關就行了;缺點是你試圖傳送的第乙個訊息(「 how are you?」 )就需要 1 3 1 次閃爍,更糟的是,你忘了定義標點符號,所以無法表示句尾的問號了。
這離問題的解決已經很近了,你想別人以前肯定也遇到過類似的問題,你解決它的思想一定是正確的。 為了解決問題, 白天的圖書館之行使你發現了神奇的摩爾斯電碼(morse code),這正是你想要的,即使你不得不重新學習如何「寫」字母表中的字母。以下就是區別:在你發明的體系中,每個字母是一定數目的閃爍,從閃爍一下的 a到閃爍26的z;而在摩爾斯電碼中,有長短兩種閃爍,當然,這會使摩爾斯電碼更為複雜,但它在實際應用中卻被證實是更有效的。那句「 how are you?」現在僅需 3 2次而不是 1 3 1 次閃爍,而且這還包含了問號。
在討論摩爾斯電碼的工作原理時,人們並不說「長閃爍」 、 「短閃爍」,他們使用「點( d o t)」和「劃( d a s h)」,因為這樣易於在印刷品上表示。在摩爾斯電碼中,字母表中的每乙個字母與乙個點劃序列相對應,正如在下表中你所看到的:
儘管摩爾斯電碼與計算機毫不相關,但熟悉它的本質卻對深入了解計算機內部語言和軟硬體的內部結構有很大的幫助。在本書中,編碼或**( c o d e)通常指一種在人和機器之間進行資訊轉換的系統(體系)。換句話說,編碼便是交流。有時我們將編碼看成是密碼 (機密),其實大多數編碼並不是的。大多數的編碼都需要被很好地理解,因為它們是人類交流的基礎。
在《百年孤獨》的一書的開篇,馬爾克斯回憶了乙個時代,那時「世界一片混沌,許多事物沒有名字。為了加以區別才給事物各個命名。 」這些名字都是隨意的,沒有什麼原因說明為什麼不把貓稱為狗或不把狗稱為貓。可以說英語詞彙就是一種編碼。我們用嘴發出聲音組成單詞,這些詞可以為那些聽得到我們聲音,理解我們所用語言的人所聽懂,我們稱這種編碼為「口頭語言」或「語音」。對寫在紙上(或鑿在石頭上、刻在木頭上或通過比劃寫在空氣中)的詞,還有一種編碼方式,那就是我們在印刷的報刊,雜誌和書籍上看到的字元,稱之為「書面語言」或「文字」。在許多語言中,語音和文字間有很強的聯絡。例如在英語中,字母或一組字母與一定的讀音相對應。
手勢語言的發明幫助了聾啞人進行面對面的交流。這是一種用手和胳膊的動作組合來表達詞語中的單個字母、整個詞及其基本概念的語言。對盲人來說,他們可以使用布萊葉盲文( braille)。這種文字使用凸起的點代表字母,字母串和單詞。當談話內容要被迅速地記錄下來時,縮寫和速記是很有用的。
人們在相互溝通時使用了各種不同的編碼,因為在不同的應用場合,其中的一些較其他的更為簡便。例如,語言不能在紙上儲存,所以使用了文字;語言、文字不適合用來在黑夜中安靜地傳遞訊息,故摩爾斯電碼是乙個方便的替代品。只要一種編碼可以適用於其他編碼所不能適用的場合,它就是一種有用的編碼。
用手電筒傳送摩爾斯電碼時,電筒的開關快速地合開代表乙個點,讓電筒照亮稍長的時間則代表乙個劃。舉例來說,傳送字母 a,要先快速地合開開關,然後再稍慢些合開。在傳送下乙個字母前要有短暫的停頓。約定劃的時間大約是點的 3 倍。例如,如果點的照亮時間為 1秒,那麼劃就是 3秒。 (實際上,摩爾斯電碼的傳遞速度要快得多。 )接收者看到了短閃和長閃就知道是 a。
摩爾斯電碼中點劃之間的間隔是極為關鍵的。例如,傳送字母 a時,點劃之間的間隔應與乙個點的時間大致相同(如果點的時間是 1 秒,那麼間隔的時間也是 1 秒) 。同乙個詞中字母間間隔稍長,約為劃的持續時間(或者 3 秒,如果那是劃的持續時間的話)。下面是單詞「 h e l l o」對應的摩爾斯電碼,圖中示意了字母間的間隔(隙):
單詞之間相隔大約 2倍於劃的時間(如果劃是 3秒,那麼間隔即為 6秒)。下面是「 hi there」對應的編碼(碼字):
手電筒開和關的時間長度並沒有限定,這取決於點的時間長度,點長又由手電筒開關觸發的速度和摩爾斯電碼傳送者記憶電碼的熟練程度來決定,熟練傳送者的劃也許與生手的點等長。這個小問題會使接收電碼有些困難,但在一兩個字母之後,接收者通常就可以辨認出哪個是點,哪個是划了。粗看起來,摩爾斯電碼的定義— 這裡所謂的定義是指與字母表中的字母相對應的各種點劃序列— 與打字機字母的排列一樣是隨意的。但仔細觀察後你會發現不完全如此,簡短的碼字分配給了使用頻率較高的字母,例如 e和 t,愛賭博的人和「財富之輪」愛好者可能一下就注意到了這個問題;不常用的字母如 q和 z(它們在賭局中是 1 0點)則分配以較長的碼字。
幾乎所有人都知道一點兒摩爾斯電碼,國際遇險訊號 s o s的摩爾斯電碼為「三點三劃三點」。 s o s並非縮寫,選擇它僅僅因為它有乙個易記的摩爾斯電碼序列。第二次世界大戰中,英 國 廣 播 公 司 選 用 貝 多 芬 第 五 交 響 曲 中 的 片 段 作 為 節 目 前 奏 — b a h 、 b a h 、 b a h 、b a h m m m m m,聽起來頗像摩爾斯電碼中 v(代表vi c t or y)的碼字。
摩爾斯電碼的乙個缺點是它沒有對大小寫字母進行區分。除表示字母外,摩爾斯電碼還用 5位長的碼字來表示數字:
這些數字的碼字看起來還有些規律 (相對於字母對應的碼字而言 )。大多數標點符號的碼字採用 5位、 6位或7位的碼長:
對歐洲一些語言中的重音字母以及一些有特殊用途的縮寫定義了特別的碼字, s o s就是這樣乙個縮寫:傳送時每個字母的碼字之間僅有一點的時間間隔。如果有特製的用於傳送摩爾斯電碼的手電筒,你和朋友之間的交流就方便多了。這種手電筒除了常有的開關,還有乙個按鈕,按壓按鈕就可以控制電筒的亮滅。經過練習後,你們每分鐘可以傳送和接收 5~1 0個單詞。雖然仍比交談慢(大概每分鐘 1 0 0個詞左右)但已足夠用了。
當你和朋友最終熟記了摩爾斯電碼時(這是唯一精通傳送接收的方法),你也可以用它代替日常用的語言。為了達到最高的速度,可以發「滴( d i h)」音代表點、 「嗒( d a h)」音代表劃。摩爾斯電碼同樣也可將文字簡化為用點和划兩個符號表示。以上的關鍵在於「兩」這個詞 —「滴、嗒」兩個聲音, 「點、劃」兩種方式。實際上任何兩種不同的東西經過一定的組合都可以代表任何種類的資訊。
編碼的奧秘
文字檔案解析 文字檔案對應於人類可以閱讀的文字,如何從2進製轉換為文字檔案呢?起初由於計算機在美國發明,自然大家考慮的是英語如何表示,英語字母總共26個,加 上特殊字元,128個字元,7位既乙個byte即可表示出來。這個就是大家所熟知的ascill編碼。對應關係很簡單,乙個字元對應一乙個byte。但...
編碼的奧秘
c語言 乙個常量與乙個變數相加 i i 5 在c語言中,可以簡寫為 i 5 如果只需要把變數加1 即增量 簡寫語句 i 1,布林陣列從2 10000的所以數字來演算法 begin boolean array a 2 10000 integer i,j for i 2 step 1 until 100...
字元編碼的奧秘
字 符編碼相信是每個程式設計師的噩夢,只要是有中文的地方,總是會遇到各種編碼的問題,並且這種問題還非常難纏,尤其在linux上,因為上面很多軟體都是針對 英語國家開發的,是不會考慮其他語種編碼問題。在遇到編碼的無數大坑之後,我決定仔細研究下編碼問題,因為這就像一道坎一直橫在你面前,每次到這裡你都會 ...