查ASC碼/理解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位元編碼又如何來處理成千上萬的中文、日文、韓文筆劃以及韓語音節?-- 摘自《編碼的奧秘》