第1節 ASCII碼對照表
ASCII(American Standard Code for Information Interchange,美國信息互換標准代碼,ASCⅡ)是基於拉丁字母的一套電腦編碼系統。它主要用於顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統,並等同於國際標准ISO/IEC 646。
ASCII第一次以規范標准的型態發表是在1967年,最后一次更新則是在1986年,至今為止共定義了128個字符,其中33個字符無法顯示(這是以現今操作系統為依歸,但在DOS模式下可顯示出一些諸如笑臉、撲克牌花式等8-bit符號),且這33個字符多數都已是陳廢的控制字符,控制字符的用途主要是用來操控已經處理過的文字,在33個字符之外的是95個可顯示的字符,包含用鍵盤敲下空白鍵所產生的空白字符也算1個可顯示字符(顯示為空白)。
1.1 ASCII控制字符
| 二進制 |
十進制 |
十六進制 |
縮寫 |
名稱/意義 |
| 0000 0000 |
0 |
00 |
NUL |
空字符(Null) |
| 0000 0001 |
1 |
01 |
SOH |
標題開始 |
| 0000 0010 |
2 |
02 |
STX |
本文開始 |
| 0000 0011 |
3 |
03 |
ETX |
本文結束 |
| 0000 0100 |
4 |
04 |
EOT |
傳輸結束 |
| 0000 0101 |
5 |
05 |
ENQ |
請求 |
| 0000 0110 |
6 |
06 |
ACK |
確認回應 |
| 0000 0111 |
7 |
07 |
BEL |
響鈴 |
| 0000 1000 |
8 |
08 |
BS |
退格 |
| 0000 1001 |
9 |
09 |
HT |
水平定位符號 |
| 0000 1010 |
10 |
0A |
LF |
換行鍵 |
| 0000 1011 |
11 |
0B |
VT |
垂直定位符號 |
| 0000 1100 |
12 |
0C |
FF |
換頁鍵 |
| 0000 1101 |
13 |
0D |
CR |
歸位鍵 |
| 0000 1110 |
14 |
0E |
SO |
取消變換(Shift out) |
| 0000 1111 |
15 |
0F |
SI |
啟用變換(Shift in) |
| 0001 0000 |
16 |
10 |
DLE |
跳出數據通訊 |
| 0001 0001 |
17 |
11 |
DC1 |
設備控制一(XON 啟用軟件速度控制) |
| 0001 0010 |
18 |
12 |
DC2 |
設備控制二 |
| 0001 0011 |
19 |
13 |
DC3 |
設備控制三(XOFF 停用軟件速度控制) |
| 0001 0100 |
20 |
14 |
DC4 |
設備控制四 |
| 0001 0101 |
21 |
15 |
NAK |
確認失敗回應 |
| 0001 0110 |
22 |
16 |
SYN |
同步用暫停 |
| 0001 0111 |
23 |
17 |
ETB |
區塊傳輸結束 |
| 0001 1000 |
24 |
18 |
CAN |
取消 |
| 0001 1001 |
25 |
19 |
EM |
連接介質中斷 |
| 0001 1010 |
26 |
1A |
SUB |
替換 |
| 0001 1011 |
27 |
1B |
ESC |
跳出 |
| 0001 1100 |
28 |
1C |
FS |
文件分割符 |
| 0001 1101 |
29 |
1D |
GS |
組群分隔符 |
| 0001 1110 |
30 |
1E |
RS |
記錄分隔符 |
| 0001 1111 |
31 |
1F |
US |
單元分隔符 |
| 0111 1111 |
127 |
7F |
DEL |
刪除 |
1.2 ASCII可顯示字符
| 二進制 |
十進制 |
十六進制 |
圖形 |
二進制 |
十進制 |
十六進制 |
圖形 |
二進制 |
十進制 |
十六進制 |
圖形 |
| 0010 0000 |
32 |
20 |
(空格) |
0100 0000 |
64 |
40 |
@ |
0110 0000 |
96 |
60 |
` |
| 0010 0001 |
33 |
21 |
! |
0100 0001 |
65 |
41 |
A |
0110 0001 |
97 |
61 |
a |
| 0010 0010 |
34 |
22 |
" |
0100 0010 |
66 |
42 |
B |
0110 0010 |
98 |
62 |
b |
| 0010 0011 |
35 |
23 |
# |
0100 0011 |
67 |
43 |
C |
0110 0011 |
99 |
63 |
c |
| 0010 0100 |
36 |
24 |
$ |
0100 0100 |
68 |
44 |
D |
0110 0100 |
100 |
64 |
d |
| 0010 0101 |
37 |
25 |
% |
0100 0101 |
69 |
45 |
E |
0110 0101 |
101 |
65 |
e |
| 0010 0110 |
38 |
26 |
& |
0100 0110 |
70 |
46 |
F |
0110 0110 |
102 |
66 |
f |
| 0010 0111 |
39 |
27 |
' |
0100 0111 |
71 |
47 |
G |
0110 0111 |
103 |
67 |
g |
| 0010 1000 |
40 |
28 |
( |
0100 1000 |
72 |
48 |
H |
0110 1000 |
104 |
68 |
h |
| 0010 1001 |
41 |
29 |
) |
0100 1001 |
73 |
49 |
I |
0110 1001 |
105 |
69 |
i |
| 0010 1010 |
42 |
2A |
* |
0100 1010 |
74 |
4A |
J |
0110 1010 |
106 |
6A |
j |
| 0010 1011 |
43 |
2B |
+ |
0100 1011 |
75 |
4B |
K |
0110 1011 |
107 |
6B |
k |
| 0010 1100 |
44 |
2C |
, |
0100 1100 |
76 |
4C |
L |
0110 1100 |
108 |
6C |
l |
| 0010 1101 |
45 |
2D |
- |
0100 1101 |
77 |
4D |
M |
0110 1101 |
109 |
6D |
m |
| 0010 1110 |
46 |
2E |
. |
0100 1110 |
78 |
4E |
N |
0110 1110 |
110 |
6E |
n |
| 0010 1111 |
47 |
2F |
/ |
0100 1111 |
79 |
4F |
O |
0110 1111 |
111 |
6F |
o |
| 0011 0000 |
48 |
30 |
0 |
0101 0000 |
80 |
50 |
P |
0111 0000 |
112 |
70 |
p |
| 0011 0001 |
49 |
31 |
1 |
0101 0001 |
81 |
51 |
Q |
0111 0001 |
113 |
71 |
q |
| 0011 0010 |
50 |
32 |
2 |
0101 0010 |
82 |
52 |
R |
0111 0010 |
114 |
72 |
r |
| 0011 0011 |
51 |
33 |
3 |
0101 0011 |
83 |
53 |
S |
0111 0011 |
115 |
73 |
s |
| 0011 0100 |
52 |
34 |
4 |
0101 0100 |
84 |
54 |
T |
0111 0100 |
116 |
74 |
t |
| 0011 0101 |
53 |
35 |
5 |
0101 0101 |
85 |
55 |
U |
0111 0101 |
117 |
75 |
u |
| 0011 0110 |
54 |
36 |
6 |
0101 0110 |
86 |
56 |
V |
0111 0110 |
118 |
76 |
v |
| 0011 0111 |
55 |
37 |
7 |
0101 0111 |
87 |
57 |
W |
0111 0111 |
119 |
77 |
w |
| 0011 1000 |
56 |
38 |
8 |
0101 1000 |
88 |
58 |
X |
0111 1000 |
120 |
78 |
x |
| 0011 1001 |
57 |
39 |
9 |
0101 1001 |
89 |
59 |
Y |
0111 1001 |
121 |
79 |
y |
| 0011 1010 |
58 |
3A |
: |
0101 1010 |
90 |
5A |
Z |
0111 1010 |
122 |
7A |
z |
| 0011 1011 |
59 |
3B |
; |
0101 1011 |
91 |
5B |
[ |
0111 1011 |
123 |
7B |
{ |
| 0011 1100 |
60 |
3C |
< |
0101 1100 |
92 |
5C |
\ |
0111 1100 |
124 |
7C |
| |
| 0011 1101 |
61 |
3D |
= |
0101 1101 |
93 |
5D |
] |
0111 1101 |
125 |
7D |
} |
| 0011 1110 |
62 |
3E |
> |
0101 1110 |
94 |
5E |
^ |
0111 1110 |
126 |
7E |
~ |
| 0011 1111 |
63 |
3F |
? |
0101 1111 |
95 |
5F |
_ |
|
|
|
|
第2節 字符的進制轉換
2.1 獲取字符(8位)的上四位和下四位
舉例1:字符‘a’,它對應的二進制(或稱ASCII碼)為0110 0001,該二進制的上四位為0110,下四位為0001,這兩個二進制對應的十六進制為6和1。
舉例2:字符‘d’,它對應的二進制(或稱ASCII碼)為0110 0100,該二進制的上四位為0110,下四位為0100,這兩個二進制對應的十六進制為6和4。
源代碼:
| #include<iostream> // 核心函數 unsigned char* Char2(unsigned char ch){ static unsigned char szHex[2]; szHex[0] = ch/16; szHex[1] = ch%16; return &szHex[0]; } // 調試部分 void main (){ unsigned char* char_buff; char_buff = Char2('a'); system("pause"); } |
由於二進制不好輸出,這里通過調試查看char_buff的結果:字符’o’的上四位a=’\x6’,下四位b=’\xf’。其中\x表示16進制,也就是說a的16進制數為6,b的十六進制數為f,各自對應的十進制數為6和15。

2.2 獲取字符(上表中的‘圖形’)所對應的 十六進制字符
舉例3:(續例1)字符‘a’,它對應的16進制為61,若要在屏幕輸出兩個字符6和1,需要將‘a’轉化為兩個字符,這兩個字符的ASCII碼為0011 0110,0011 0001。
舉例4:字符‘o’,它對應的16進制為6F,若要在屏幕輸出兩個字符6和F,需要將‘o’轉化為兩個字符,這兩個字符的ASCII碼為0011 0110,0100 0110。
| #include<stdlib.h> using namespace std; unsigned char* Char2Hex(unsigned char ch){ unsigned char byte[2],i; static unsigned char szHex[2]; byte[0] = ch/16; // 獲得ch字符(8位)的上四位 byte[1] = ch%16; // 獲得ch字符(8位)的下四位 for(i=0; i<2; i++){ if(byte[i] >= 0 && byte[i] <= 9) szHex[i] = '0' + byte[i]; else szHex[i] = 'a' + byte[i] - 10; } return &szHex[0]; } void main (){ unsigned char* char_buff; char_buff = Char2Hex('o'); cout<<char_buff[0]<<endl; cout<<char_buff[1]<<endl; system("pause"); } |
輸出結果:

2.3 獲取字符對應的十六進制字符的第二種方法(傻瓜式)
根據2.1節的獲取8進制字符的上4位、下4位的方法,我聯想到了一個新的方法來獲取其16進制的字符。結果同2.2節,但原理很簡單:
舉例5:字符‘o’,它的ASCII碼為0110 1111,上四位0110,下四位1111,這兩個二進制對應的十進制分別為6和15。只需將6和15通過一個unsigned char數組進行映射即可獲得兩個字符6和F。
這個unsigned char數組的構造為:char_map[17] = "0123456789ABCDEF"; 具體代碼如下。結果與2.2節一致。
| #include<iostream> #include<stdlib.h> using namespace std; // 用一個字符數組做映射 unsigned char char_map[17] = "0123456789ABCDEF"; //unsigned char char_map[16] = {'0','1','2','3','4','5','6','7','8','9', // 'A','B','C','D','E','F'}; // 核心函數 仍然是2.1節中的代碼 unsigned char* Char2(unsigned char ch){ static unsigned char szHex[2]; szHex[0] = ch/16; szHex[1] = ch%16; return &szHex[0]; } // 調試部分 void main (){ unsigned char* char_buff; char_buff = Char2('o'); // 這里將char類型的char_buff當數使用 cout<<char_map[char_buff[0]]<<endl; cout<<char_map[char_buff[1]]<<endl; system("pause"); } |
輸出結果:

2.4 遞歸的方法獲取字符對應的二進制字符
舉例6:字符‘a’,它對應的ASCII碼為0011 0110,沒錯我就是要在屏幕上輸出0011 0110!!!
具體的代碼貼在下面,注釋寫的很清楚,需要的話可以仔細研究一下。
其實這與“中序二叉樹遍歷“算法類似
| #include<iostream> #include<stdlib.h> using namespace std; // 核心函數 // ch:傳入的字符; n:除數,n:除數,它等於當前ch可能到的最大值的根; // m:指針,用於索引數組,初始值為0; out_bin[]:輸出的二進制字符串 void Char2Bin(unsigned char ch,int n, int *m, unsigned char out_bin[]){ if (n>4){ // ch/n和ch%n是為4位的二進制(最大值可以用4位的二進制表示,實際它還是unsigned char類型的,占用8位) // 要獲取4位二進制的上2位和下二位,除數n=2^(4/2)=4 Char2Bin(ch/n,n/4,m,out_bin); Char2Bin(ch%n,n/4,m,out_bin); } else if (n>2){ // ch/n和ch%n是2位的二進制 // 要獲取它的上1位和下一位,除數n=2^(2/2)=2 Char2Bin(ch/n,n/2,m,out_bin); Char2Bin(ch%n,n/2,m,out_bin); } else{ // 當前ch是2位的二進制,只需將其轉化為0和1即可 out_bin[(*m)++] = ch/2 + '0'; out_bin[(*m)++] = ch%2 + '0'; return; // 到這里必須返回,否則都會運行最后一行再返回,造成冗余 } out_bin[8] = '\0'; // 字符數組最后以'\0'結尾就會變成字符串, // 可以參考 http://www.runoob.com/cplusplus/cpp-strings.html }
// 調試部分 void main (){ unsigned char out[9]; int m = 0; Char2Bin('a',16,&m,out); // 當前ch是8位的二進制,要獲取ch的上4位和下4位,所以除數n=2^(8/2)=16 cout << out << endl; system("pause"); } |
輸出結果:

