2015-10-21 2 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 

Таким образом, оказывается, что экранированные символы этого формата сделать связаны к таблице ascii с отношением «менее 2».

  • Почему существует разница между двумя таблицами ascii и экранированным символом?

  • В чем смысл этого и почему он работает таким образом?

  • Это просто нюанс strace?

+0

После немного больше испытаний я заметил, что не было «меньше 2» отношения между двумя как упомянутое выше. Ответы ниже объясняют это напрямую. – sherrellbc

ответ

1

strace использует стандартное С строкой обозначение, в котором обратный слэш следует цифры является восьмеричным кодом символов.

10 восьмеричных = 8 десятичное
12 восьмеричный = 10 десятичное

2

Экранированный символ не кодируются в десятичной системе. Это один-три цифры восьмеричный номер.

С имеет несколько форм характера ускользает:

  1. Backslash и характер спецификатор (т.е. '\n', '\r' и т.д.)
  2. Backslash и от 1 до 3 цифр (восьмеричное спецификатор, цифры не должны быть 8 или 9. т.е. '\377')
  3. Backslash и x, то шестнадцатеричное число (т.е. '\x40')
  4. Backslash и u, то шестнадцатеричное число (Unic постоянная ода)

10 в восьмеричном формате 8 в десятичной форме, следовательно, ваш результат. Существует не отношения «меньше два», хотя, потому что 20 восьмеричной является 16 десятичное, восьмеричное 30 является 24 десятичный и т.д.

Смежные вопросы