C输出大于127的ACSII字符

近期,我们的DNS服务器收到了一些异常的域名请求,从访问日志看到很多域名都被返回了FORMAT ERROR的错误码,但是访问日志中的域名看起来很正常啊,为什么会返回FORMAT ERROR的错误码呢?

  经过一系列排查,找到了直接原因。
  问题在于我们收到的一些DNS消息包的请求域名中含有值大于127的字符。下面是该非法域名中其中一个label的十六进制数据:

0x09, 0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e.

可以看到,中间有一个0xe1,它的值是225,它在终端上是不可打印的字符。包含这样的字符的域名会被我们认为是非法的域名,所以返回了FORMATERROR,但是为什么访问日志中看不到这个字符呢?让我们做个实验看一下:

#include <stdio.h>

int main()
{
    unsigned char s[] = {0x74, 0x61, 0x6f, 0x62, 0xe1, 0x6f, 0x63, 0x64, 0x6e, ‘\0‘};  

    printf("%s\n", s);
    return 0;
}

  上面的代码会打印出什么呢?理论上它会打印出"taob?ocdn",其中的"?"是那个0xe1在终端输出的样子,但是实际上它的输出是:

taobn

  可以看到,输出时,0xe1以及其后的三个字符都没有被输出到终端。所以我们在访问日志中看到的是一个合法的域名。。。。

这里有对这个问题的详细讨论。

对于不可打印的ASCII码,如果将它们输出到终端,它们的行为是跟终端的字符编码有关。所以最保险的方法是,对于不可打印的那些ASCII码,做一下特殊处理,因为如果将它们输出到终端的话,你看到的不一定是实际的内容。

时间: 2024-11-08 17:46:13

C输出大于127的ACSII字符的相关文章

Multisim 运放输出大于电源的问题

之前用Multisim做运放电路仿真时发现运放输出大于电源轨的现象,有时想拿运放当比较器做开环仿真,但在multisim中的仿真结果居然是线性放大,而且输出超过电源电压,非常郁闷,因此之后仿真都是用Cadence 的orcad/Pspice来仿真.不过画个频率响应都要用公式来绘图,信号比较多,操作不简洁. 后来发现Multisim的Pspice模型可以自己选择,而默认的运放模型是不考虑电源的三端模型(3 Terminal Opamp Model ),所谓的三端就是只考虑同相端.反相端.输出端.如

53.从键盘输入任意一串字符串,程序输出同样的一串字符,要求输出字符串中大小写相互转化,其他符号不变。如输入“a123BxC”,则输出“A123bXc”

(1)我的错误程序: #include<iostream> #include<string.h> using namespace std; int ZhuanHuan(char); int main() { char a[100]; cout<<"please input a string: "<<endl; cin>>a; for(int i=0;i<strlen(a);i++) { ZhuanHuan(a[i]);

ECMAScript6面对大于0xFFFF的Unicode字符如何正确返回长度

一.match() 1.定义 match()方法用于检索字符串内指定(字符串或正则)的值,返回指定值的数组,若找不到,返回null. 2.语法 str.match(searchvalue) str.match(regexp) 3.示例 let str = 'abc-def-zxc'; console.log(str.match('-')); // ["-", index: 3, input: "abc-def-zxc"] console.log(str.match(

在Qt中怎样显示ASCII码大于127的字符

前段时间要显示“≤”符号找了挺久没找到方法,后面发现用以下方法可以解决: ushort gd[]={8805,0};    QString gteq=QString::fromUtf16(gd); 得到的gteq就是“≤”: 函数:QString::fromUtf16(const ushort* unicode,int size=-1): 参数  unicode:是我们要的字符串对应的unicode码数组: 参数  size:       是数组的长度,如果没有指定长度则要以0结束: 那怎么知道

输出字符串中不同的字符打印输出

java示例演示: public static void main(String[] args) { System.out.println("请输入任意字符(按Enter执行):"); Scanner input = new Scanner(System.in); String string = input.next(); System.out.println("你输入的字符有:"); func(string); } /** * 输出一个字符串中的不同的字符. */

求接题目:输入一个字符串输出大小写数字及其他字符的个数并逆序输出

9wwwp0b5mw啥睾约抑汕丶防内肯劝<http://weibo.com/p/230927987600061628162048> rvzxpb9vfd肿氨撩都币涡绰腔脚备<http://weibo.com/p/230927987600585677082624> 18o8arvl2k疽芈孔瞪收抡幻勘特婪<http://weibo.com/p/230927987599767041220608> q4y38xjw2c段斗趁己敲沟钙俜腺甘<http://weibo.co

Python3基础 str for 输出字符串中的每个字符

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? code """ @Author : 行初心 @Date : 18-9-23 @Blog : www.cnblogs.com/xingchuxin @GitHub : github.com/GratefulHeartCoder """ de

前端学HTTP之字符集

前面的话 HTTP报文中可以承载以任何语言表示的内容,就像它能承载图像.影片或任何类型的媒体那样.对HTTP来说,实体主体只是二进制信息的容器而已.为了支持国际性内容,服务器需要告知客户端每个文档的字母表和语言,这样客户端才能正确地把文档中的信息解包为字符并把内容呈现给用户,而要实现这个功能,需要用到接下来要详细介绍的字符集 首部概述 服务器通过HTTP协议的Content-Type首部中的charset参数和Content-Language首部告知客户端文档的字母表和语言.这些首部描述了实体主

c语言:用getchar函数读入两个字符给c1,c2,用putchar和printf输出。思考问题

用getchar函数读入两个字符给c1,c2,分别用putchar和printf输出这两个字符.思考以下问题: (1)变量c1和c2定义为字符型还是整型?或二者皆可? (2)要求输出c1和c2的ASCII码,应如何处理? (3)整形变量和字符变量是否在任何情况下都可以互相代替?char c1, c2;和int  c1, c2;是否无条件等价? 程序: #include<stdio.h> int main() { char c1, c2; printf("请输入两个字符c1,c2:&q