理解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进制值为0×41 — 其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进制值为0×36 — 其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进制表示分别为0×31、0×32和0×33。这样组合起来后要传送的数据应为"001100010011001000110011"。

四、总结
一个字符串在内存中就是按照逐个字符的ASCII码连续存放的,我们在传送字符串时一般无需做特殊转换。

[注1]
尽管ASCII码是计算机世界里最重要的标准,但它并不是完美的。ASCII码的最大问题在于它太倾向于美国!的确, ASCII码即使对那些以英语为主要语言的国家也几乎是不合适的。尽管ASCII码包含有美元符号,但英镑符号呢?还有许多西欧国家语言中用到的重音符号呢?更不用说在欧洲一些国家里使用的非拉丁字母,包括希腊文、阿拉伯文、希伯来文和西里尔文。此外,还有印度及东南亚国家用到的婆罗门教的手迹。而一个7位编码又如何来处理成千上万的中文、日文、韩文笔画以及韩语音节?– 摘自《编码的奥秘

我还健康

谈到程序员似乎总是离不开“健康”这个话题,程序员是职业病的高发群体,一般工作2-3年的程序员或多或少的都有“小疾”。每个正规的公司每年都应有至少一次的“福利体检”。今天是我第一次参加公司的福利体检,入司时参加过体检,由于大学刚毕业,自然很自信身体没问题。在公司度过一年的时光后,也道听途说的知道一些说法,比如“某某人工作一年得高血压、脂肪肝”等,这给我这次体检带来了一丝悬念,自己也在担心我现在的身体还健康么?

记得刚来公司的3个多月里,我每周至少打上2次乒乓球,每天回寝室都练臂力,作俯卧撑等。随着工作的深入,学习的压力和工作的压力让我无暇顾及身体锻炼,时间长了,感觉自己越来越懒惰,回到寝室就坐在电脑前,都懒得起来。在公司里不时的有同事群发些关于保健保养的小文章,我看完后便让它进入了“收藏箱”。程序员英年早逝的例子也不在少数,每次在网上看到如此消息,便不由的想象自己的生活是否健康,感受深了便加紧锻炼两天,然后一切又恢复成和以前一样。曾经参加过若干培训,很多讲师问道:“什么是你感觉最重要的事”?很多人回答“事业、家庭等”,也有人回答“健康”,当回答健康的人被问及“你平时坚持有计划的锻炼么”,得到的回答却是“不能坚持”。

体检的过程很顺利,特别是我担心的“胸透和B超”都顺利通过,我也终于长出了一口气,可以侥幸的说“我还健康”。这次虽然写下了这篇blog引以为戒,但我也不能保证以后我能坚持自己的“健康计划”,不知下次体检的时候我还能不能是健康群体中的一员了。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats