定义
转义字符是C语言中表示字符的一种特殊形式。通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符。
示例
\a | 响铃(BEL) |
\b | 退格(BS) |
\f | 换页(FF) |
\n | 换行(LF) |
\r | 回车(CR) |
\t | 水平制表符(HT) |
\v | 垂直制表符(VT) |
\\ | 反斜杠 \ |
\0 | 空字符(NULL),常用作字符串结尾 |
\ddd | 任意字符,最多写三位8进制数字 |
\xhh | 任意字符,最多写两位16进制数字 |
应用场景
- 网络协议
在网络协议中,都会存在帧头、帧尾,用来界定一个完整的帧,以解决粘包现象。
例如下面的简单协议格式:
起始码 | 数据长度 | 数据内容 | 校验码 | 结束码 |
0xCD 0xCD | 0x00 0x3D | (字符串) | 0xED 0x70 | 0x3A 0x4D |
我们要向网络发送一个完整的数据帧,首先需要恰当的数据内容,再对数据内容进行封装——添加起始码、结束码,计算数据长度、校验码,只有帧格式符合协议规定格式,才允许其发送。
然而很多时候,我们会发现将起始码、结束码添加到帧(以字符串形式存储全部数据)并不容易。如何将16进制的数简易地转换为字符串呢?方法有如下几种:
- 将每一字节的16进制数字依次转换为字符类型,再逐个赋值到帧字符串对应索引位置。
- 直接将整个16进制数转换为字符串形式,然后追加到帧字符串中。
对于方法1,可这样实现:
//存储完整一帧数据
char data[256];
//定义char变量,并以16进制数为其赋值
//添加起始码
char c = 0xCD;
data[0] = c;
data[1] = c;
//添加结束码
c = 0x3A;
data[254] = c;
c = 0x4D;
data[255] = c;
可以看到,每一位数字的赋值,都需要2行代码,相当麻烦,尤其是这样的数非常多的时候。
下面我们看看方法2的实现:
//存储完整一帧数据
char data[256];
//定义char *变量,并以字符串为其赋值
//添加起始码
char *str = "\xCD\xCD"; //注意转义字符的使用,\xhh表示十六进制数字
strcpy(data, str);
//添加结束码
str = "\x3A\x4D";
strcpy(data+254, str);
可以对比一下,发现方法2比方法1简洁、可读性好,同时易于理解。
当要转换的数非常多的时候,使用方法2将明显提高转换效率!