ASCII

基於拉丁字母的電腦編碼系統

ASCII ((American Standard Code for Information Interchange): 美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。它是最通用的信息交換標準,並等同於國際標準ISO/IEC 646。ASCII第一次以規範標準的類型發表是在1967年,最後一次更新則是在1986年,到目前為止共定義了128個字元。

產生


在計算機中,所有的數據在存儲和運算時都要使用二進位數表示(因為計算機用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數字還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進位數來表示,而具體用哪些二進位數字錶示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那麼大家就必須使用相同的編碼規則,於是美國有關的標準化組織就出台了ASCII編碼,統一規定了上述常用符號用哪些二進位數來表示。
美國標準信息交換代碼是由美國國家標準學會(American National Standard Institute,ANSI )制定的,標準的單位元組字元編碼方案,用於基於文本的數據。起始於50年代後期,在1967年定案。它最初是美國國家標準,供不同計算機在相互通信時用作共同遵守的西文字元編碼標準,它已被國際標準化組織(International Organization for Standardization,ISO)定為國際標準,稱為ISO 646標準。適用於所有拉丁文字字母。

表述方式


ASCII碼使用指定的7位或8位二進位數組合來表示128或256種可能的字元。標準ASCII碼也叫基礎ASCII碼,使用7位二進位數來表示所有的大寫和小寫字母,數字0到9、標點符號,以及在美式英語中使用的特殊控制字元。其中:0~31及127(共33個)是控制字元或通信專用字元(其餘為可顯示字元),如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BS(退格)、BEL(響鈴)等;通信專用字元:SOH(文頭)、EOT(文尾)、ACK(確認)等;ASCII值為8、9、10和13分別轉換為退格、製表、換行和回車字元。它們並沒有特定的圖形顯示,但會依不同的應用程序,而對文本顯示有不同的影響。
32~126(共95個)是字元(32是空格),其中48~57為0到9十個阿拉伯數字。65~90為26個大寫英文字母,97~122號為26個小寫英文字母,其餘為一些標點符號、運算符號等。
同時還要注意,在標準ASCII中,其最高位(b7)用作奇偶校驗位。所謂奇偶校驗,是指在代碼傳送過程中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種。奇校驗規定:正確的代碼一個位元組中1的個數必須是奇數,若非奇數,則在最高位b7添1;偶校驗規定:正確的代碼一個位元組中1的個數必須是偶數,若非偶數,則在最高位b7添1。
后128個稱為擴展ASCII碼。許多基於x86的系統都支持使用擴展(或“高”)ASCII。擴展ASCII碼允許將每個字元的第8位用於確定附加的128個特殊符號字元、外來語字母和圖形符號。

標準I表


BinDecHex縮寫/字元解釋
0000 000000NUL(null)空字元
0000 0001101SOH(start of headline)標題開始
0000 0010202STX (start of text)正文開始
0000 0011303ETX (end of text)正文結束
0000 0100404EOT (end of transmission)傳輸結束
0000 0101505ENQ (enquiry)請求
0000 0110606ACK (acknowledge)收到通知
0000 0111707BEL (bell)響鈴
0000 1000808BS (backspace)退格
0000 1001909HT (horizontal tab)水平製表符
0000 1010100ALF (NL line feed, new line)換行鍵
0000 1011110BVT (vertical tab)垂直製表符
0000 1100120CFF (NP form feed, new page)換頁鍵
0000 1101130DCR (carriage return)回車鍵
0000 1110140ESO (shift out)不用切換
0000 1111150FSI (shift in)啟用切換
0001 00001610DLE (data link escape)數據鏈路轉義
0001 00011711DC1 (device control 1)設備控制1
0001 00101812DC2 (device control 2)設備控制2
0001 00111913DC3 (device control 3)設備控制3
0001 01002014DC4 (device control 4)設備控制4
0001 01012115NAK (negative acknowledge)拒絕接收
0001 01102216SYN (synchronous idle)同步空閑
0001 01112317ETB (end of trans. block)傳輸塊結束
0001 10002418CAN (cancel)取消
0001 10012519EM (end of medium)介質中斷
0001 1010261ASUB (substitute)替補
0001 1011271BESC (escape)換碼(溢出)
0001 1100281CFS (file separator)文件分割符
0001 1101291DGS (group separator)分組符
0001 1110301ERS (record separator)記錄分離符
0001 1111311FUS (unit separator)單元分隔符
0010 00003220(space)空格
0010 00013321!
0010 00103422"
0010 00113523#
0010 01003624$
0010 01013725%
0010 01103826&
0010 01113927'
0010 10004028(
0010 10014129)
0010 1010422A*
0010 1011432B+
0010 1100442C,
0010 1101452D-
0010 1110462E.
00101111472F/
001100004830
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C\
01011101935D]
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C|
011111011257D}
011111101267E~
011111111277FDEL (delete)刪除
八進位十六進位十進位字元八進位十六進位十進位字元
nul1004064@
111soh1014165A
222stx1024266B
333etx1034367C
444eot1044468D
555enq1054569E
666ack1064670F
777bel1074771G
1088bs1104872H
1199ht1114973I
120a10nl1124a74J
130b11vt1134b75K
140c12ff1144c76L
150d13cr1154d77M
160e14so1164e78N
170f15si1174f79O
201016dle1205080P
211117dc11215181Q
221218dc21225282R
231319dc31235383S
241420dc41245484T
251521nak1255585U
261622syn1265686V
271723etb1275787W
301824can1305888X
311925em1315989Y
321a26sub1325a90Z
331b27esc1335b91[
341c28fs1345c92\
351d29gs1355d93]
361e30re1365e94^
371f31us1375f95_
402032sp1406096'
412133!1416197a
422234"1426298b
432335#1436399c
442436$14464100d
452537%14565101e
462638&14666102f
472739`14767103g
502840(15068104h
512941)15169105i
522a42*1526a106j
532b43+1536b107k
542c44,1546c108l
552d45-1556d109m
562e46.1566e110n
572f47/1576f111o
60304816070112p
613149116171113q
623250216272114r
633351316373115s
643452416474116t
653553516575117u
663654616676118v
673755716777119w
703856817078120x
713957917179121y
723a58:1727a122z
733b59;1737b123{
743c60<1747c124|
753d61=1757d125}
763e62>1767e126~
773f63?1777f127del

大小規則


ASCII表
ASCII表
1)數字0~9比字母要小。如"7"<"F";
2)數字0比數字9要小,並按0到9順序遞增。如"3"<"8"
3)字母A比字母Z要小,並按A到Z順序遞增。如"A"<"Z"
4)同個字母的大寫字母比小寫字母要小。如"A"<"a"。
記住幾個常見字母的ASCII碼大小:
“換行LF”為0x0A;“回車CR”為0x0D;空格為0x20;"0"為0x30;"A"為0x41;"a"為0x61。
另外還有128-255的ASCII字元。
查詢ASCII技巧,方便查詢ASCII碼對應的字元:新建一個文本文檔,按住ALT+要查詢的碼值(注意,這裡是十進位),鬆開即可顯示出對應字元。例如:按住ALT+97,則會顯示出a。

國際問題


ASCII是美國標準,所以它不能良好滿足其它講英語國家的需要。例如英國的英鎊符號(£)在哪裡?
拉丁語字母表重音符號。
使用斯拉夫字母表的希臘語希伯來語、阿拉伯語和俄語。
漢字系統的中國象形漢字,日本和朝鮮。
1967年,國際標準化組織(ISO:InternationalStandardsOrganization)推薦一個ASCII的變種,
代碼0x40、0x5B、0x5C、0x5D、0x7B、0x7C和0x7D“為國家使用保留”,而代碼0x5E、0x60和0x7E標為“當國內要求的特殊字元需要8、9或10個空間位置時,可用於其它圖形符號”。這顯然不是一個最佳的國際解決方案。
因為這並不能保證一致性。但這卻顯示了人們如何想盡辦法為不同的語言來編碼的。

擴展


1981年IBM PC ROM256個字元的字符集,即IBM擴展字符集
1985年11 Windows字符集被稱作“ANSI字符集”,遵循了ANSI草案和ISO標準(ANSI/ISO8859-1-1987,簡“Latin 1”。ANSI字符集的最初版本:
1987年4月代碼頁437,字元的映像代碼,出現在MS-DOS3.3。
擴展ASCII 字元是從128 到255(0x80-0xff)的字元。
擴展ASCII不再是國際標準。

雙位元組


雙位元組字符集(DBCS:double-bytecharacterset),解決中國、日本和韓國的象形文字元和ASCII的某種兼容性。
DBCS從256代碼開始,就像ASCII一樣。與任何行為良好的代碼頁一樣,最初的128個代碼是ASCII。
然而,較高的128個代碼中的某些總是跟隨著第二個位元組。
這兩個位元組一起(稱作首位元組和跟隨位元組)定義一個字元,通常是一個複雜的象形文字。

虛擬值


ASCII
ASCII
ESC鍵VK_ESCAPE(27)
回車鍵:VK_RETURN(13)
TAB鍵:VK_TAB(9)
CapsLock鍵:VK_CAPITAL(20)
Shift鍵:VK_SHIFT(16)
Ctrl鍵:VK_CONTROL(17)
Alt鍵:VK_MENU(18)
空格鍵:VK_SPACE(32)
退格鍵:VK_BACK(8)
左徽標鍵:VK_LWIN(91)
右徽標鍵:VK_RWIN(92)
滑鼠右鍵快捷鍵:VK_APPS(93)
Insert鍵:VK_INSERT(45)
Home鍵:VK_HOME(36)
PageUp:VK_PRIOR(33)
PageDown:VK_NEXT(34)
End鍵:VK_END(35)
Delete鍵:VK_DELETE(46)
方向鍵(←):VK_LEFT(37)
方向鍵(↑):VK_UP(38)
方向鍵(→):VK_RIGHT(39)
方向鍵(↓):VK_DOWN(40)
F1鍵:VK_F1(112)
F2鍵:VK_F2(113)
F3鍵:VK_F3(114)
F4鍵:VK_F4(115)
F5鍵:VK_F5(116)
F6鍵:VK_F6(117)
F7鍵:VK_F7(118)
F8鍵:VK_F8(119)
F9鍵:VK_F9(120)
F10鍵:VK_F10(121)
F11鍵:VK_F11(122)
F12鍵:VK_F12(123)
NumLock鍵:VK_NUMLOCK(144)
小鍵盤0:VK_NUMPAD0(96)
小鍵盤1:VK_NUMPAD1(97)
小鍵盤2:VK_NUMPAD2(98)
小鍵盤3:VK_NUMPAD3(99)
小鍵盤4:VK_NUMPAD4(100)
小鍵盤5:VK_NUMPAD5(101)
小鍵盤6:VK_NUMPAD6(102)
小鍵盤7:VK_NUMPAD7(103)
小鍵盤8:VK_NUMPAD8(104)
小鍵盤9:VK_NUMPAD9(105)
小鍵盤。:VK_DECIMAL(110)
小鍵盤*:VK_MULTIPLY(106)
小鍵盤+:VK_ADD(107)
小鍵盤-:VK_SUBTRACT(109)
小鍵盤/:VK_DIVIDE(111)
PauseBreak鍵:VK_PAUSE(19)
ScrollLock鍵:VK_SCROLL(145)

編程相關


Pascal
取得ASCII碼:Ord(ch)
得到對應字元:Chr(n)
VisualBasic
取得ASCII碼:Asc(ch)
得到對應字元:Chr(n)
PCLOGO編程
取得ASCII碼:asc(某個字元,如大寫的A)(輸出答案:65)

代碼演演算法


ASCII非列印控制字元表
ASCII非列印控制字元表
在ascii中定義為01000001,也就是十進位65,有了這個標準后,當我們輸入A時,計算機就可以通過ascii碼知道輸入的字元的二進位編碼是01000001。而沒有這樣的標準,我們就必須自己想辦法告訴計算機我們輸入了一個A;沒有這樣的標準,我們在別的機器上就需要重新編碼以告訴計算機我們要輸入A。ascii碼指的不是十進位,是二進位。只是用十進位表示習慣一點罷了,比如在ascii碼中,A的二進位編碼為01000001,如果用十進位表示是65,用十六進位表示就是41H。
在ascii碼錶中,只包括了一些字元、數字、標點符號的信息表示,這主要是因為計算機是美國發明的,在英文下面,我們使用ascii表示就足夠了!但是在漢字輸入下面,用ascii碼就不能表示了,而漢字只是中國的通用表示,所以如果我們要在計算機中輸入漢字,就必須有一個像ascii碼的標準來表示每一個漢字,這就是中國的漢字國標碼,它定義了漢字在計算機中的一個表示標準。通過這個標準,但我們輸入漢字的時候,我們的輸入碼就轉換為區位碼,通過唯一的區位碼得到這個漢字的字形碼並顯示出來。當然漢字的區位碼在計算機中也是用二進位表示的。
一、二進位數轉換為十進位數
二進位數第0位的權值是2的0次方,第1位的權值是2的1次方……
所以,設有一個二進位數:0110 0100,轉換為10進位為:
下面是豎式:
0110 0100 換算成 十進位
第0位 0 * 20 = 0
第1位 0 * 21 = 0
第2位 1 * 22 = 4
第3位 0 * 23 = 0
第4位 0 * 24 = 0
第5位 1 * 25 = 32
第6位 1 * 26 = 64
第7位 0 * 27 = 0
用橫式計算為:
0 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100
0乘以多少都是0,所以我們也可以直接跳過值為0的位:
1 * 22 + 1 * 23 + 1 * 25 + 1 * 26 = 100
二、八進位數轉換為十進位數
八進位就是逢8進1。
八進位數採用 0~7這八數來表達一個數。
八進位數第0位的權值為8的0次方,第1位權值為8的1次方,第2位權值為8的2次方……
所以,設有一個八進位數:1507,轉換為十進位為:
用豎式表示:
1507換算成十進位。
第0位 7 * 80 = 7
第1位 0 * 81 = 0
第2位 5 * 82 = 320
第3位 1 * 83 = 512
同樣,我們也可以用橫式直接計算:
7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839
結果是,八進位數 1507 轉換成十進位數為 839
八進位數的表達方法
C,C++語言中,如何表達一個八進位數呢?如果這個數是 876,我們可以斷定它不是八進位數,因為八進位數中不可能出7以上的阿拉伯數字。但如果這個數是123、是567,或12345670,那麼它是八進位數還是10進位數,都有可能。
所以,C,C++規定,一個數如果要指明它採用八進位,必須在它前面加上一個0,如:123是十進位,但0123則表示採用八進位。這就是八進位數在C、C++中的表達方法。
由於C和C++都沒有提供二進位數的表達方法,所以,這裡所學的八進位是我們學習的,CtC++語言的數值表達的第二種進位法。
現在,對於同樣一個數,比如是100,我們在代碼中可以用平常的10進位表達,例如在變數初始化時:
int a = 100;
我們也可以這樣寫:
int a = 0144; //0144是八進位的100;一個10進位數如何轉成8進位,我們後面會學到。
千萬記住,用八進位表達時,你不能少了最前的那個0。否則計算機會通通當成10進位。不過,有一個地方使用八進位數時,卻不能使用加0,那就是我們前面學的用於表達字元的“轉義符”表達法。
八進位數在轉義符中的使用
我們學過用一個轉義符'\'加上一個特殊字母來表示某個字元的方法,如:'\n'表示換行(line),而'\t'表示Tab字元,'\''則表示單引號。今天我們又學習了一種使用轉義符的方法:轉義符'\'後面接一個八進位數,用於表示ASCII碼等於該值的字元。
比如,查一下第5章中的ASCII碼錶,我們找到問號字元(?)的ASCII值是63,那麼我們可以把它轉換為八進值:77,然後用 '\77'來表示'?'。由於是八進位,所以本應寫成 '\077',但因為C,C++規定不允許使用斜杠加10進位數來表示字元,所以這裡的0可以不寫。
事實上我們很少在實際編程中非要用轉義符加八進位數來表示一個字元,所以,6。2。4小節的內容,大家僅僅了解就行。
十六進位數轉換成十進位數
2進位,用兩個阿拉伯數字:0、1;
8進位,用八個阿拉伯數字:0、1、2、3、4、5、6、7;
10進位,用十個阿拉伯數字:0到9;
16進位,用十六個阿拉伯數字……等等,阿拉伯人或說是印度人,只發明了10個數字啊?
16進位就是逢16進1,但我們只有0~9這十個數字,所以我們用A,B,C,D,E,F這五個字母來分別表示10,11,12,13,14,15。字母不區分大小寫。
十六進位數的第0位的權值為16的0次方,第1位的權值為16的1次方,第2位的權值為16的2次方
所以,在第N(N從0開始)位上,如果是是數 X (X 大於等於0,並且X小於等於 15,即:F)表示的大小為 X * 16的N次方。
假設有一個十六進數 2AF5,那麼如何換算成10進位呢
用豎式計算:
2AF5換算成10進位:
第0位: 5 * 160 = 5
第1位: F * 161 = 240
第2位: A * 162 = 2560
第3位: 2 * 163 = 8192
直接計算就是:
5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997
(別忘了,在上面的計算中,A表示10,而F表示15)
現在可以看出,所有進位換算成10進位,關鍵在於各自的權值不同。
假設有人問你,十進數 1234 為什麼是 一千二百三十四?你盡可以給他這麼一個算式:
1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100
十六進位數的表達方法
如果不使用特殊的書寫形式,16進位數也會和10進位相混。隨便一個數:9876,就看不出它是16進位或10進位。
C,C++規定,16進位數必須以 0x開頭。比如 0x1表示一個16進位數。而1則表示一個十進位。另外如:0xff,0xFF,0X102A,等等。其中的x也也不區分大小寫。(注意:0x中的0是數字0,而不是字母O)
以下是一些用法示例:
int a = 0x100F;
int b = 0x70 + a;
至此,我們學完了所有進位:10進位,8進位,16進位數的表達方式。最後一點很重要,C/C++中,10進位數有正負之分,比如12表示正12,而-12表示負12,;但8進位和16進位只能用達無符號的正整數,如果你在代碼中里:-078,或者寫:-0xF2,C,C++並不把它當成一個負數。
十六進位數在轉義符中的使用
轉義符也可以接一個16進位數來表示一個字元。如在6。2。4小節中說的 '?' 字元,可以有以下表達方式:
'?' //直接輸入字元
'\77' //用八進位,此時可以省略開頭的0
'\0x3F' //用十六進位
同樣,這一小節只用於了解。除了空字元用八進位數 '\0' 表示以外,我們很少用后兩種方法表示一個字元。
三、十進位數轉換到二、八、十六進位數
進位數轉換為2進位數
給你一個十進位,比如:6,如果將它轉換成二進位數呢?
10進位數轉換成二進位數,這是一個連續除2的過程:
把要轉換的數,除以2,得到商和餘數,
將商繼續除以2,直到商為0。最後將所有餘數倒序排列,得到數就是轉換結果。
聽起來有些糊塗?我們結合例子來說明。比如要轉換6為二進位數。
“把要轉換的數,除以2,得到商和餘數”。
那麼:
要轉換的數是6, 6 ÷ 2,得到商是3,餘數是0。 (不要告訴我你不會計算6÷3!)
“將商繼續除以2,直到商為0……”
現在商是3,還不是0,所以繼續除以2。
那就: 3 ÷ 2,得到商是1,餘數是1。
“將商繼續除以2,直到商為0……”
現在商是1,還不是0,所以繼續除以2。
那就: 1 ÷ 2,得到商是0,餘數是1 (拿筆紙算一下,1÷2是不是商0餘1!)
“將商繼續除以2,直到商為0……最後將所有餘數倒序排列”
好極!現在商已經是0。
我們三次計算依次得到餘數分別是:0、1、1,將所有餘數倒序排列,那就是:110了!
6轉換成二進位,結果是110。
把上面的一段改成用表格來表示,則為:
被除數 計算過程 商 餘數
6 6/2 3 0
3 3/2 1 1
1 1/2 0 1
(在計算機中,÷用 / 來表示)
如果是在考試時,我們要畫這樣表還是有點費時間,所更常見的換算過程是使用下圖的連除:
(圖:1)
請大家對照圖,表,及文字說明,並且自已拿筆計算一遍如何將6轉換為二進位數。
說了半天,我們的轉換結果對嗎?二進位數110是6嗎?你已經學會如何將二進位數轉換成10進位數了,所以請現在就計算一下110換成10進位是否就是6。
6。3。2 10進位數轉換為8、16進位數
非常開心,10進位數轉換成8進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成8。
來看一個例子,如何將十進位數120轉換成八進位數。
用表格表示:
被除數 計算過程 商 餘數
120 120/8 15 0
15 15/8 1 7
1 1/8 0 1
120轉換為8進位,結果為:170。
非常非常開心,10進位數轉換成16進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成16。
同樣是120,轉換成16進位則為:
被除數 計算過程 商 餘數
120 120/16 7 8
7 7/16 0 7
120轉換為16進位,結果為:78。
請拿筆紙,採用(圖:1)的形式,演算上面兩個表的過程。
四、十六進位數互相轉換
二進位和十六進位的互相轉換比較重要。不過這二者的轉換卻不用計算,每個C,C++程序員都能做到看見二進位數,直接就能轉換為十六進位數,反之亦然。
我們也一樣,只要學完這一小節,就能做到。
首先我們來看一個二進位數:1111,它是多少呢?
你可能還要這樣計算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。
然而,由於1111才4位,所以我們必須直接記住它每一位的權值,並且是從高位往低位記,:8、4、2、1。即,最高位的權值為23 = 8,然後依次是 22 = 4,21=2, 20 = 1。
記住8421,對於任意一個4位的二進位數,我們都可以很快算出它對應的10進位值。
下面列出四位二進位數 xxxx 所有可能的值(中間略過部分)
僅4位的2進位數 快速計算方法 十進位值 十六進值
1111 = 8 + 4 + 2 + 1 = 15 F
1110 = 8 + 4 + 2 + 0 = 14 E
1101 = 8 + 4 + 0 + 1 = 13 D
1100 = 8 + 4 + 0 + 0 = 12 C
1011 = 8 + 4 + 0 + 1 = 11 B
1010 = 8 + 0 + 2 + 0 = 10 A
1001 = 8 + 0 + 0 + 1 = 10 9
。。。。
0001 = 0 + 0 + 0 + 1 = 1 1
0000 = 0 + 0 + 0 + 0 = 0 0
二進位數要轉換為十六進位,就是以4位一段,分別轉換為十六進位。
如(上行為二制數,下面為對應的十六進位):
1111 1101 , 1010 0101 , 1001 1011
F D , A 5 , 9 B
反過來,當我們看到 FD時,如何迅速將它轉換為二進位數呢?
先轉換F:
看到F,我們需知道它是15(可能你還不熟悉A~F這五個數),然後15如何用8421湊呢?應該是8 + 4 + 2 + 1,所以四位全為1 :1111。
接著轉換 D:
看到D,知道它是13,13如何用8421湊呢?應該是:8 + 4 + 1,即:1101。
所以,FD轉換為二進位數,為: 1111 1101
由於十六進位轉換成二進位相當直接,所以,我們需要將一個十進位數轉換成2進位數時,也可以先轉換成16進位,然後再轉換成2進位。
比如,十進位數 1234轉換成二制數,如果要一直除以2,直接得到2進位數,需要計算較多次數。所以我們可以先除以16,得到16進位數:
被除數 計算過程 商 餘數
1234 1234/16 77 2
77 77/16 4 13 (D)
4 4/16 0 4
結果16進位為: 0x4D2
然後我們可直接寫出0x4D2的二進位形式: 0100 1011 0010。
其中對映關係為:
0100 -- 4
1011 -- D
0010 -- 2
同樣,如果一個二進位數很長,我們需要將它轉換成10進位數時,除了前面學過的方法是,我們還可以先將這個二進位轉換成16進位,然後再轉換為10進位。
下面舉例一個int類型的二進位數:
01101101 11100101 10101111 00011011
我們按四位一組轉換為16進位: 6D E5 AF 1B

漢字編碼


0-127 是 7位ASCII 碼的範圍,是國際標準。
至於漢字,不同的字符集用的ascii 碼的範圍也不一樣,常用的漢字字符集有GB2312-80,GBK
Big5,unicode 等。下面我重點說一說最常用的GB_2312 的字符集。
GB_2312 字符集是目前最常用的漢字編碼標準,windows 95/98/2000 中使用的 GBK字符集 就包含了GB2312,或者說和GB2312 兼容,GB_2312 字符集包含了 6763個的 簡體漢字,和682 個標準中文符號。在這個標準中,每個漢字用2個位元組來表示,每個位元組的ascii碼為 161-254 (16 進位A1 - FE),第一個位元組 對應於 區碼的1-94 區,第二個位元組 對應於位碼的1-94 位。
161-254 其實很好記憶,大家知道英文字元中,可列印的字元範圍為33-126。將 這對 數加上
128(或者說最高位置1),就得到漢字使用的字元的範圍。
//GB18030的規範是漢字第一個位元組在0x81-0xFE之間,第二個位元組位於區間0x40-0x7E以及0x80-0xFE。每個位元組轉化為整數大於128。
if ((char_temp>=0x81)&&(char_temp<=0xFE))
{
if(*len
{
*len+=1;
*p_temp++=char_temp;
_putch(char_temp);
x++;
}
}

進位製表


八進位十六進位十進位字元八進位十六進位十進位字元
nul1004064@
111soh1014165A
222stx1024266B
333etx1034367C
444eot1044468D
555enq1054569E
666ack1064670F
777bel1074771G
1088bs1104872H
1199ht1114973I
120a10nl1124a74J
130b11vt1134b75K
140c12ff1144c76L
150d13cr1154d77M
160e14so1164e78N
170f15si1174f79O
201016dle1205080P
211117dc11215181Q
221218dc21225282R
231319dc31235383S
241420dc41245484T
251521nak1255585U
261622syn1265686V
271723etb1275787W
301824can1305888X
311925em1315989Y
321a26sub1325a90Z
331b27esc1335b91[
341c28fs1345c92\
351d29gs1355d93]
361e30re1365e94^
371f31us1375f95_
402032sp1406096'
412133!1416197a
422234"1426298b
432335#1436399c
442436$14464100d
452537%14565101e
462638&14666102f
472739`14767103g
502840(15068104h
512941)15169105i
522a42*1526a106j
532b43+1536b107k
542c44,1546c108l
552d45-1556d109m
562e46.1566e110n
572f47/1576f111o
60304816070112p
613149116171113q
623250216272114r
633351316373115s
643452416474116t
653553516575117u
663654616676118v
673755716777119w
703856817078120x
713957917179121y
723a58:1727a122z
733b59;1737b123{
743c60<1747c124|
753d61=1757d125}
763e62>1767e126~
773f63?1777f127del