写在前面:
遇到问题——解决问题——讲述(自言自语、教授别人,讨论)——解决上一步骤中遇到的问题。
感觉用这种螺旋式上升的步骤理解一个问题,比较深刻。
在学习的开源项目是一个网络调试助手。其中有一项是“HEX发送”。这一问题引发了一个非常有趣的思考:
串口的数据是如何发送接收的???(这里强调数据格式,而不是硬件)
在已经可以正常运行的某个项目中,有如下代码:
int TCPCommunication::Receive(SOCKET& sock_fd,char* buff,int len)
int size=recv(sock_fd,buff,len,0);
比较粗犷,就是接收了一个字符。这是我就比较纳闷了——我是要一个十进制的数以表示位置,你发我一个字符怎么办?
来来回回撸了几遍,终于有点明白了:
#define twlve 12
int tmpint2 = 12;
tmpchar = tmpint2; //机器形成发送数据(字符);
qDebug()<<tmpchar; //输出ascii值10对应的字符;
if(twlve == tmpchar){ //校验字符;
qDebug()<<"true";
}
tmpint = tmpchar; //接收到数据,将字符重新转为整形数;
std::cout<<tmpint<<std::endl; //成功显示12;
请看,假如机器想发坐标值 int 12,就直接把 int 给 char 就行了;我接到 char ,再把 char 给int 就又得到了 int 12 。就是这么简单!!!发的时候一样道理。
问1:这中间到底是这么传递的?
答:贼简单,就是二进制!!!
问2:我把过程中的tmpchar打印出来,它不是一个十六进制数啊?
答:小伙子,你和我一样迷!
我且问你:一个char能打印出十六进制的数吗???
不能唉。tmpchar是字符变量,当你想打印它时,计算机取出那8个位的二进制数,先把他转成十进制数D,再将D作为ASCII值找到对应的ASCII码,最后打印出这个ASCII码!所以打印tmpchar只会看到一个奇怪的符号(题中打印出的是 ↑ )。
我再问你:为什么你痴迷形似 0xFFFF FFFF 十六进制数?
那知识别人偷懒的结果!你想传递的 int 12,只能通过二进制
0000 1100(32位机)传递,这写起来太费事啦!怎么办,偷个懒写成 0x0C。这只是人偷懒的结果!