ASCII中的控制字符含义
⼗进制⼗六进制控制字符转义字符说明Ctrl + 下列字母000NUL\0Null character(空字符)@
101SOH Start of Header(标题开始)A
202STX Start of Text(正⽂开始)B
303ETX End of Text(正⽂结束)C
404EOT End of Transmission(传输结束)D
505ENQ Enquiry(请求)E
606ACK Acknowledgment(收到通知/响应)F
707BEL\a Bell(响铃)G
808BS\b Backspace(退格)H
909HT\t Horizontal Tab(⽔平制表符)I
100A LF\n Line feed(换⾏键)J
110B VT\v Vertical Tab(垂直制表符)K
120C FF\f Form feed(换页键)L
130D CR\r Carriage return(回车键)M
140E SO Shift Out(不⽤切换)N
150F SI Shift In(启⽤切换)O
1610DLE Data Link Escape(数据链路转义)P
1711DC1Device Control 1(设备控制1) /XON(Transmit On)Q
1812DC2Device Control 2(设备控制2)R
1913DC3Device Control 3(设备控制3) /XOFF(Transmit Off)S
2014DC4Device Control 4(设备控制4)T
2115NAK Negative Acknowledgement(拒绝接收/⽆响应)U
2216SYN Synchronous Idle(同步空闲)V
2317ETB End of Trans the Block(传输块结束)W
2418CAN Cancel(取消)X
2519EM End of Medium(已到介质末端/介质存储已满)Y
261A SUB Substitute(替补/替换)Z
271B ESC\e Escape(溢出/逃离/取消)[
281C FS File Separator(⽂件分割符)\
291D GS Group Separator(分组符)]
301E RS Record Separator(记录分隔符)^
311F US Unit Separator(单元分隔符)_
3220SP White space[Space]
1277F DEL Delete(删除)?
0 – NUL – NULl 字符/空字符
ASCII字符集中的空字符,NULL,起初本意可以看作为NOP(中⽂意为空操作,就是啥都不做的意思),此位置可以忽略⼀个字符。
之所以有这个空字符,主要是⽤于计算机早期的记录信息的纸带,此处留个NUL字符,意思是先占这个位置,以待后⽤,⽐如你哪天想起来了,在这个位置在放⼀个别的啥字符之类的。
后来呢,NUL字符被⽤于C语⾔中,字符串的终结符,当⼀个字符串中间出现NUL/ NULL,代码⾥⾯表现为\0,的时候,就意味着这个是⼀个字符串的结尾了。这样就⽅便按照⾃⼰需求去定义字符串,多长都⾏,当然只要你内存放得下,然后最后加⼀个\0, 即空字符,意思是当前字符串到此结束。
1 – SOH – Start  Of Heading 标题开始
如果信息沟通交流主要以命令和消息的形式的话,SOH就可以⽤于标记每个消息的开始。
1963年,最开始ASCII标准中,把此字符定义为Startof Message,后来⼜改为现在的Start Of Heading。
现在,这个SOH常见于主从(master-slave)模式的RS232的通信中,⼀个主设备,以SOH开头,和
从设备进⾏通信。这样⽅便从设备在数据传输出现错误的时候,在下⼀次通信之前,去实现重新同步(resynchronize)。如果没有⼀个清晰的类似于SOH这样的标记,去标记每个命令的起始或开头的话,那么重新同步,就很难实现了。
2 – STX,
3 – ETX
2 – STX – Start Of Text ⽂本开始
3 – ETX – End Of Text ⽂本结束
通过某种通讯协议去传输的⼀个数据(包),称为⼀帧的话,常会包含⼀个帧头,包含了寻址信息,即你是要发给谁,要发送到⽬的地是哪⾥,其后跟着真正要发送的数据内容。
⽽STX,就⽤于标记这个数据内容的开始。接下来是要传输的数据,最后是ETX,表明数据的结束。
其中,中间具体传输的数据内容,ASCII规范并没有去定义,其和你所⽤的传输协议,具体⾃⼰要传什么数据有关。
帧头数据或⽂本内容
SOH(表明帧头开始)......(帧头信息,⽐如包含了⽬的地址,表明你发送
给谁等等)
STX(表明数据开
始)
......(真正要传输的
数据)
ETX(表明数据
结束
不过其中有趣的是,1963年,ASCII标准最初版本的时候,把现在的STX叫做EOA(End Of Address),ETX叫做(End Of Message)。
这是因为,最早的时候,⼀个消息中,总是包含⼀个开始符和⼀个终⽌符。现在的新的定义,使得可以去发送⼀个固定长度的命令,⽽只⽤⼀个SOH表明帧头开始即可,⽽不需要再加上⼀个命令终⽌符
或帧头结束符。
总结⼀下:
⼀般发送⼀个消息,包含了⼀个帧头和后⾯真正要传的数据。
⽽对于帧头,属于控制类的信息,这部分之前属于命令,后⾯的真实要传的数据属于数据。即消息=帧头+数据。
⽽之前的命令都要有个开始符和结束符,这样就是:
消息
= 帧头                      + 要传的数据
= 帧头开始+帧头信息+帧头结束 + 要传的数据
⽽现在新的定义,使得只需要:
消息
= 帧头 +要传的数据
= SOH(表明帧头开始)+帧头信息+ 要传的数据
= SOH(表明帧头开始)+帧头信息  + STX + 数据内容+ETX
就可以少⽤⼀个帧头结束符。
⽽如今,在很多协议中,也常见到,⼀个固定长度的帧头,后⾯紧接着就是数据了,⽽没有所谓的帧头结束符之类的东西去区分帧头和数据。
4 – EOT – End Of Transmission 传输结束
5 – ENQ – ENQuiry 请求
6 – ACK – ACKnowledgment 回应/响应
7 – BEL – [audible] BELl
在ASCII字符集中,BEL,是个⽐较有意思的东东。
因为其原先本意不是⽤来数据编码的,于此相反,ASCII中的其他字符,都是⽤于字符编码(即⽤什么字符,代表什么含义)或者起到控制设备的作⽤。
BEL⽤⼀个可以听得见的声⾳,来吸引⼈们的注意,其原打算即⽤于计算机也⽤于⼀些设备,⽐如打印机等。
C语⾔⾥⾯也⽀持此BEL,⽤a来实现这个响铃。
8 – BS – BackSpace 退格键
退格键的功能,随着时间变化,意义也变得不同了。
起初,意思是,在打印机和电传打字机上,往回移动⼀格光标,以起到强调该字符的作⽤。
⽐如你想要打印⼀个a,然后加上退格键后,就成了aBS^。在机械类打字机上,此⽅法能够起到实际的强调字符的作⽤,但是对于后来的CTR下时期来说,就⽆法起到对应效果了。
⽽现代所⽤的退格键,不仅仅表⽰光标往回移动了⼀格,同时也删除了移动后该位置的字符。在C语⾔中,退格键可以⽤b表⽰。
9 – HT – Horizontal Tab ⽔平制表符
ASCII中的HT控制符的作⽤是⽤于布局的。
其控制输出设备前进到下⼀个表格去处理。
⽽制表符Table/Tab的宽度也是灵活不固定的,只不过,多数设备上,制表符Tab的宽度都预定义为8。
⽔平制表符HT不仅能减少数据输⼊者的⼯作量,对于格式化好的⽂字来说,还能够减少存储空间,因为⼀个Tab键,就代替了8个空格,所以说省空间。
对于省空间的优点,我们现在来看,可能会觉得可笑,因为现在存储空间已⾜够⼤,⼀般来说根本不会需要去省那么点可怜的存储空间。
但是,实际上在计算机刚发明的时候,存储空间(主要指的是内存)极其有限也极其昂贵,⽽且像ZIP等压缩⽅法也还没发明呢,所以对于当时来说,对于存储空间,那是能够省⼀点是⼀点,省任何⼀点,都是好的,也都是不容易的,省空间就是省钱啊。
C语⾔中,⽤t表⽰制表符。
ascii共有多少个字符
10 – LF – Line Feed 换⾏
LF,直译为(给打印机等)喂⼀⾏,意思就是所说的,换⾏。
换⾏字符,是ASCII字符集中,被误⽤的字符中的其中⼀个。
LF的最原始的含义是,移动打印机的头到下⼀⾏。⽽另外⼀个ASCII字符,CR(Carriage Return)才是将打印机的头,移到最左边即⼀⾏的开始,⾏⾸。很多串⼝协议和MS-DOS及Windows操作系统,也都是这么实现的。
⽽于此不同,对于C语⾔和Unix操作系统,其重新定义了LF字符的含义为新⾏,即LF和CR的组合才能表达出的,回车且换⾏的意思。
虽然你可以争论哪种⽤法是错的,但是,不可否认,是从程序的⾓度出发,C语⾔和Unix对此LF的含义实现显得就很⾃然,⽽MS-DOS的实现更接近于LF的本意。
如果最开始ASCII标准中,及定义 CF也定义newline,那样意思会清楚,会更好理理解:
LF表⽰物理上的,设备控制⽅⾯的移动到下⼀⾏(并没有移动到⾏⾸);
新⾏(newline)表⽰逻辑上⽂本分隔符,即回车换⾏。
不过呢,现在⼈们常将LF⽤做newline新⾏的功能,⽽⼤多数⽂本编辑软件也都可以处理单个LF或者CR/LF的组合了。
LF在C语⾔中,⽤n表⽰。
11 – VT – Vertical Tab 垂直制表符
垂直制表符,类似于⽔平制表符Tab,⽬的是为了减少布局中的⼯作,同时也减少了格式化字符时所需要存储字符的空间。VT控制码⽤于跳到下⼀个标记⾏。
说实话,还真没看到有些地⽅需要⽤这个VT呢,因为⼀般在换⾏的时候,都是⽤LF代替VT了。
12 – FF – Form Feed  换页
设计换页键,是⽤来控制打印机⾏为的。
当打印机收到此键码的时候,打印机移动到下⼀页。
不同的设备的终端对此控制码所表现的⾏为各不同。有些会去清除屏幕,⽽其他有的只是显⽰^L字符或者是只是新换⼀⾏⽽已。
Shell脚本程序Bash和Tcsh的实现⽅式是,把FF看作是⼀个清除屏幕的命令。C语⾔程序中⽤f表⽰FF(换页)。
13 – CR – Carriage return 机器的滑动部分/底座返回 -> 回车
CR回车的原意是让打印头回到左边界,并没有移动到下⼀⾏。
随着时间流逝,后来⼈把CR的意思弄成了Enter键,⽤于⽰意输⼊完毕。
在数据以屏幕显⽰的情况下,⼈们在Enter的同时,也希望把光标移动到下⼀⾏。
因此C语⾔和Unix操作系统,重新定义了LF的意思,使其表⽰为移动到下⼀⾏。当输⼊CR去存储数据的时候,软件也常常隐式地将其转换为LF。
14 – SO,15 – SI
14 – SO – Shift Out 不⽤切换
15 – SI – Shift In  启⽤切换
早在1960s年代,定义ASCII字符集的⼈,就已经懂得了,设计字符集不单单可以⽤于英⽂字符集,也要能应⽤于外⽂字符集,是很重要的。
定义Shift In 和Shift Out的含义,即考虑到了此点。
最开始,其意为在西⾥尔语和拉丁语之间切换。
西⾥尔ASCII定义中,KOI-7⽤到了Shift字符。拉丁语⽤Shift去改变打印机的字体。
在此种⽤途中,SO⽤于产⽣双倍宽度的字符,⽽⽤SI打印压缩的字体。
16 – DLE – Data Link Escape 数据链路转义
有时候,我们需要在正在进⾏的通信过程中去发送⼀些控制字符。但是,总有⼀些情况下,这些控制字符却被看成了普通的数据流,⽽没有起到对应的控制效果。⽽ASCII标准中,定义DLE来解决这类问题。
如果数据流中检测到了DLE,数据接收端则对其后⾯接下来的数据流中的字符,另作处理。
⽽关于具体如何处理这些字符,ASCII规范中则没有具体定义,⽽只是弄了个DLE去打断正常数据的处理,告诉接下来的数据,要特殊对待。
根据Modem中的Hayes通信协议DLE定义为“⽆声+++⽆声”。
以我的观点,这样可能会更好:如果Hayes协议没有把DLE处理为嵌⼊通讯的⽆声状态,那样就符合现存的标准了。
然⽽Hayes的开发者却觉得+++⽤的频率要远⾼于原始的DLE,所以才这么定义了。
17 – DC1 – Device Control 1 / XON – Transmission on
这个ASCII控制字符尽管原先定义为DC1,但是现在常表⽰为XON,⽤于串⾏通信中的软件流控制。
其主要作⽤为,在通信被控制码XOFF中断之后,重新开始信息传输。
⽤过串⾏终端的⼈应该还记得,当有时候数据出错了,按Ctrl+Q(等价于XON)有时候可以起到重新传输的效果。
这是因为,此Ctrl+Q键盘序列实际上就是产⽣XON控制码,其可以将那些由于终端或者主机⽅⾯,由于偶尔出现的错误的XOFF控制码⽽中断的通信解锁,使其正常通信。
18 – DC2 – Device Control 2

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。