@sddvxd

Почему эти строчки записываются в память по-разному?

Добрый день!
В попытке разобраться, почему я могу успешно отправлять и принимать запросы на веб-сервер на языке C и почему я не могу того-же сделать на языке ассемблера, заметил вот такую особенность:

request db 	"GET / HTTP/1.1\r\nHost: myip.ru\r\n\r\n"

char* c = "GET / HTTP/1.1\r\nHost: myip.ru\r\n\r\n";

Абсолютно одинаковые строчки с GET запросом сохраняются в оперативной памяти по-разному, а именно вот так выглядит hex код первой строчки из программы, которую собрал мне ассемблер:

47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 5c 72 5c 6e 48 6f 73 74 3a 20
6d 79 69 70 2e 72 75 5c 72 5c 6e 5c 72 5c 6e


А так на C:
47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 6d 79
69 70 2e 72 75 0d 0a 0d 0a


Это строчка в utf-8, причем онлайн конвертер hex-to utf8 выдал вот такой результат:

GET / HTTP/1.1\r\nHost: myip.ru\r\n\r\n

Вроде-бы, то что надо - но с этим запросом не работало
Теперь проверяю, как эту строчку обработал компилятор C:

GET / HTTP/1.1
Host: myip.ru

На вид они различаются, нету управляющих символов и именно с этой строкой успешно получается получить главную страницу сайта. Вопрос: почему так случается, почему в первом случае управляющие символы экранируются и как этого избежать?
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
@zedxxx
Потому что в Си, вот эта последовательность "\r" - это управляющая последовательность и в память она записывается как 0xd (один байт). Эту работу выполняет компилятор.

А в ассемблере как вы строку записали, так она в памяти и лежит, т.е. там символ "\" лежит как 0x5с, и так же лежит рядышком символ "r". Но для HTTP запроса нужен именно перевод строки (последовательность 0xd, 0xa), а не текст "\r".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы