【问题标题】:Printing escaped characters directly and their relationship with the ASCII table直接打印转义字符及其与ASCII表的关系
【发布时间】:2015-10-21 18:30:06
【问题描述】:

我在查看strace 调用的输出时遇到了一些我以前从未见过的东西。示例输出如下(来自对recv 的调用,详细说明):

recv(13, "%\0\0\0\23\0\1\0\5\0\0\0\0\0\0\0\0\0\0\0\26\0\0\0\0\0\0\0\0\0\0\0\5\0\20\0\5", 37, 0)

而其他结果如下:

recv(10, "OK\n", 3, 0)

不管实际 recv 打算传达什么,我注意到发送的每个字符都被转义了。我认为这些转义字符可能与ASCII Table 以一对一的方式相关(即\10 相当于\n)。

所以,快速测试如下:

printf("Before newline \10  After newline);

给出以下结果:

Before newline   After newline

然后我尝试以十进制形式打印字符本身的值:

printf("Value: %d", '\10');

给出结果:

Value: 8 

所以,很自然,因为区别是两个,我试过了:

printf("Before newline \12  After newline);

生产:

Before newline
After newline

因此,这种格式的转义字符确实与具有“less 2”关系的 ascii 表相关。

  • 为什么ascii表和转义字符有两个之差?

  • 这样做有什么意义,为什么会这样?

  • 这只是strace 的细微差别吗?

【问题讨论】:

  • 经过多一点测试后,我注意到上面提到的两者之间没有“小于 2”的关系。下面的答案直接解释了这一点。

标签: c escaping ascii


【解决方案1】:

strace 使用标准 C 字符串表示法,其中反斜杠后跟数字是 八进制 字符代码。

10 八进制 = 8 十进制
12 八进制 = 10 十进制

【讨论】:

    【解决方案2】:

    转义字符未以十进制编码。它是一到三位数的八进制数字。

    C 有几种形式的字符转义:

    1. 反斜杠和字符说明符(即'\n'、'\r' 等)
    2. 反斜杠和 1 到 3 位数字(八进制说明符,数字不得为 8 或 9。即 '\377'
    3. 反斜杠和x,然后是十六进制数字(即'\x40'
    4. 反斜杠和u,然后是十六进制数字(Unicode 常量)

    10 八进制是 8 十进制,因此你的结果。但是,没有“少二”的关系,因为20 八进制是16 十进制,30 八进制是24 十进制等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 2023-04-10
      • 2016-12-25
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多