ASSCII码的一点认识

来源:互联网 发布:science域名 编辑:程序博客网 时间:2024/06/05 06:23

因为计算机只识别二进制数,ASCII码相当是一种规则,将相应的英文字母,汉字,变成相应的二进制数,让计算机识别。

标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;
通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;

例如ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

字符串或串(String)是由数字、字母、下划线组成的一串字符,就是用ascii码储存的,一般记为 s=“a1a2···an”。它是编程语言中表示文本的数据类型。

对于字符串str来说,str[0]单元里面就存放了字母a的ASCII码,str[1]单元里面就存放了字母b的ASCII码。


以上是基础知识,现在问题来了。

在上篇介绍的DNS里, recvmsg(dns_fd, &msg, 0)接收数据,而iov[0].iov_base = dns_buf;即接收到的数据放在dns_buf里。

printf("dns_buf=%s\n",dns_buf)

却打印不出数据或者是打印乱码。

为什么?

换一种思路,如果dns_buf里放的是ascII码,并且str[0]单元里面就存放了字母a的ASCII码,str[1]单元里面就存放了字母b的ASCII码,那么单个打印呢?

 for(i = 0; i < n; i++)
 
    printf("0x%02X", dns_buf[i]); // X 表示以十六进制形式输出 02 表示不足两位,前面补0输出

有数据了:

0xAA 0x3D 0x01 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x03 0x77 0x77 0x77 0x05 0x62 0x61 0x69
0x64 0x75 0x03 0x63 0x6F 0x6D
0x00 0x00 0x01 0x00 0x01

简单转换一下就发现,上面标记红色的就是03 WWW 05 baidu 03 com

但是直接printf("dns_buf=%s\n",dns_buf)却打印不出,原因现在明了了,就是ascII码0的缘故。
C语言里这几个是通用的,\0'就是0,也就是NULL, 空字符。

按照字符串格式打印,当然打印不出。

所以这样改一下:printf("dns_buf=%s\n",dns_buf+12);

结果打印成功了。

这里可以联系上一篇DNS协议的东西,

报文里查询问题前面刚好是12字节。就是0xAA 0x3D 0x01 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00,因为包含ASCII码0,所以打印终止。

好,接着下一个问题:

现在如何判断DNS里请求的域名就是百度呢?当然数据对比即可。

比如:

char domain[]= "www.baidu.com";

 strstr(temp_buf, domain);

但这样却是不成功的。

依旧是ascii码的问题,改成下面这样就行了:

char domain[13]= {'w','w','w',05,'b','a','i','d','u',03,'c','o','m'};

当然,如果要求不严格的话,这样也行:

char domain[]= "baidu";


做一个实验,代码如下:

#include <string.h>#include <stdio.h>void main(){    int x=65,y=66,z=67;    char a3[]={'x','y','z','1','2','3',65,66,67,'A'};    char a31[]={'x','y','z','1','2','3',65,66,67};    char a32[]={'x','y','z','1','2','3',65,66,67,0};    char a33[8]={'x','y','z','1','2','3',65,66,67};    char a34[9]={'x','y','z','1','2','3',65,66,67};    char a35[10]={'x','y','z','1','2','3',65,66,67};    char a4[]={x,y,z};    printf("a3=%s\n",a3);    printf("a31=%s\n",a31);    printf("a32=%s\n",a32);    printf("a33=%s\n",a33);    printf("a34=%s\n",a34);    printf("a35=%s\n",a35);    printf("a4=%s\n\n",a4);}

返回结果:

a3=xyz123ABCA@a31=xyz123ABC@a32=xyz123ABCa33=xyz123ABa34=xyz123ABC@a35=xyz123ABCa4=ABC













0 0