查ASC码/理解ASCII码

查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码”的留言:

留言: --117.84.113.100 2008年12月29日 (二) 23:55 (CST) 谢谢,看了之后我有点是懂非懂. 很是感谢~~

新增相关留言