查ASC碼/理解ASCII碼

  最近在寫一個串口程式,設備提供商的通訊協定說明中明確了內部通訊方式為“ASCII碼”。其實每個和電腦打交道的人都會天天接觸ASCII碼,只是ASCII碼藏在了幕後,我們很少與之正面打交道罷了,這次機會正好讓我有機會到幕後去看看ASCII碼的“廬山真面目”。

  

  ASCII碼眾所周知全稱為“美國資訊交換標準碼,American Standard Code for Information Interchange”。不能不佩服美國人,我這裏決不是崇洋媚外,美國人在電腦領域對人類的貢獻是絕對應該被我們所牢記的,對現代人來說,這些貢獻絲毫不亞于中國人的四大發明。言歸正傳,個人覺得瞭解ASCII的由來是理解ASCII碼的最好方法。

  

  一、背景

  人們發明了電腦,並知道如何使用記憶體中的0101來表示數和機器碼。但是人類最主要的資訊展現形式是文本,如何用記憶體中的bit來表示文本一直困擾著人們,這種情況一直持續到ASCII碼發明成功後才被“部分”[注1]解決。說白了ASCII碼就是解決了一個以數位形式表示文本的問題。

  

  二、實例

  讓我們到幕後去看看,看看ASCII碼是如何以數位形式表示文本的。舉2個例子:

  (1) ASCII碼'A' -- 其記憶體存儲位元組2進制表示為"01000001" --- 其16進制值為0x41 --- 其10進制值為65(這裏的值實際上是'A'在ASCII碼表中編號);

  

  驗證過程:

  char c = 'A';

  printf("%c\n", c); /* A */

  printf("%x\n", c); /* 41 */

  printf("%d\n", c); /* 65 */

  

  (2) ASCII碼'6' -- 其記憶體存儲位元組2進制表示為"00110110" --- 其16進制值為0x36 --- 其10進制值為54(這裏的值實際上是'6'在ASCII碼表中的編號);

  

  驗證過程:

  char c = '6';

  printf("%c\n", c); /* 6 */

  printf("%x\n", c); /* 36 */

  printf("%d\n", c); /* 54 */

  

  三、ASCII碼通訊

  利用ASCII碼作為通訊方式到底是一種什麼樣的通訊方式呢?(FTP協定中有兩種通訊方式,其中一種是ASCII碼方式,即文本方式)這裏也舉例說明:比如我們要傳送數值123, 123數值用16進制表示為0x7b,以二進位表示為01111011,那麼以二進位方式通訊,01111011就是我們真實傳送的資料,但是如果以ASCII碼方式通訊,則完全不同了,如果你還傳送01111011的話,對方那邊的得到的將是'{'('{'對應的ASCII碼用16進制表示為7b)。那麼我們該如何怎麼傳呢?正確的方式就是將123每位元上的數字轉化為其相應的ASCII碼,然後傳送。這裏'1'、'2'和'3'對應的ASCII碼用16進制表示分別為0x31、0x32和0x33。這樣組合起來後要傳送的資料應為"001100010011001000110011"。

  

  四、總結

  一個字串在記憶體中就是按照逐個字元的ASCII碼連續存放的,我們在傳送字串時一般無需做特殊轉換。

  

  [注1]

  儘管ASCII碼是電腦世界裏最重要的標準,但它並不是完美的。ASCII碼的最大問題在於它太傾向於美國!的確, ASCII碼即使對那些以英語為主要語言的國家也幾乎是不合適的。儘管ASCII碼包含有美元符號,但英鎊符號呢?還有許多西歐國家語言中用到的重音符號呢?更不用說在歐洲一些國家裏使用的非拉丁字母,包括希臘文、阿拉伯文、希伯來文和西瑞爾文。此外,還有印度及東南亞國家用到的婆羅門教的手跡。而一個7位元編碼又如何來處理成千上萬的中文、日文、韓文筆劃以及韓語音節?-- 摘自《編碼的奧秘》   

關于“查ASC碼/理解ASCII碼”的用戶留言:

目前暫無留言

新增相關留言✍