2015-10-21 60 views
0

當我遇到以前沒有見過的東西時,我正在查看strace調用的輸出。這個例子輸出爲以下(從調用recv,闡述):直接打印轉義字符及其與ASCII表的關係

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 

所以,似乎躲過了這場格式的字符涉及以「少於2」的關係加入ascii表。

  • 爲什麼ascii表和轉義字符之間有兩個不同?

  • 這是什麼意思,它爲什麼這樣工作?

  • 這僅僅是一個微妙的strace

+0

一點更多的測試,我注意到有沒有兩者的之間的「少2」的關係後,上文提到的。下面的答案直接解釋了這一點。 – sherrellbc

回答

1

strace是使用標準的C字符串符號,其中反斜槓後跟數字是一個八進制字符代碼。

10八進制= 8十進制
12八進制= 10小數

2

轉義字符中未十進制編碼。它是一個一到三位數字八進制數字。

C具有幾種形式的字符逸出:

  1. 反斜線和字符符(即'\n','\r'等)
  2. 反斜槓和1至3個數字(八進制符,數字必須不是8或9即'\377'
  3. 反斜線和x,然後十六進制數(即'\x40'
  4. 反斜線和u,然後十六進制數(優納ode常數)

10八進制是十進制的,因此你的結果是8。沒有一個「少了兩個」關係,不過,因爲20八是16十進制,八進制3024十進制等