Стоповый символ
Стоповый символ (также стоп-символ, стоп-маркер, терминатор) — в теории формальных языков, программировании и телекоммуникациях — специальный знак или последовательность знаков, обозначающий конец передаваемого блока данных, сообщения, строки или файла. В отличие от служебных символов, указывающих на границы (например, пробела или перевода строки), стоповый символ выполняет функцию терминации — сигнала о том, что последующая информация не относится к данному блоку или должна игнорироваться.
История возникновения
Понятие стопового символа восходит к ранним этапам развития телеграфии и телетайпной связи. В коде Бодо (1870 год) для разделения букв использовались специальные служебные комбинации, однако чёткого выделения «конца сообщения» не существовало — оператор просто прекращал передачу. С появлением асинхронной последовательной передачи данных (начало XX века) возникла необходимость в маркерах начала и конца кадра. В стандарте RS-232 (1960-е годы) стоповым битом стал единичный импульс длительностью 1, 1,5 или 2 бита, указывающий приёмнику, что передача байта завершена.
С развитием компьютерных систем и файловых форматов стоповые символы стали применяться для обозначения конца строки (EOL) и конца файла (EOF). В операционной системе DOS (1981 год) для маркировки конца текстового файла использовался символ с кодом 0x1A (Ctrl+Z), унаследованный от CP/M. В Unix-подобных системах (с 1969 года) конец файла определяется системой по отсутствию данных, но в пользовательском вводе роль стопового символа выполняет Ctrl+D (код 0x04).
Виды и классификация
По области применения
- Стоп-символы в программировании — маркеры конца строки (
\0в C/C++,\nв текстовых файлах), конца файла (EOF), конца списка аргументов (NULL в C). - Стоп-символы в протоколах передачи данных — стоп-бит в асинхронной последовательной связи, флаг конца кадра в HDLC (0x7E), символ ETX (End of Text, код 0x03) в управляющих кодах ASCII.
- Стоп-символы в форматах данных — нулевой байт в строках C, маркер конца записи в CSV (символ перевода строки), закрывающий тег в XML/HTML.
- Стоп-символы в пользовательском вводе — Ctrl+D в Unix, Ctrl+Z в Windows, Esc в некоторых интерфейсах командной строки.
По способу кодирования
- Одиночные символы — один байт или кодовая точка (например,
\0). - Последовательности — несколько символов подряд (например,
\r\nв Windows,\nв Unix). - Управляющие последовательности — комбинации клавиш (Ctrl+D) или escape-последовательности (ESC-символы в терминалах).
Применение в программировании
Строки с нулевым символом
В языках C и C++ строки представляют собой массивы символов, завершающиеся нулевым байтом (\0). Этот стоповый символ позволяет функциям (например, strlen(), strcpy()) определять длину строки без передачи дополнительного параметра. Недостаток: если нулевой байт отсутствует (например, из-за ошибки), функции могут выйти за границы массива, что приводит к уязвимостям (переполнение буфера).
Конец файла (EOF)
В языке C конец файла обозначается макросом EOF, значение которого обычно равно -1. Функции getchar(), fgetc() возвращают EOF при попытке чтения за концом файла. В стандартных потоках ввода (stdin) EOF может быть эмулирован пользователем через Ctrl+D (Unix) или Ctrl+Z (Windows). В современных языках (Python, Java) EOF обрабатывается исключениями (например, EOFError).
Маркеры в протоколах
В протоколе TCP (1981 год) стоповый символ как таковой отсутствует — конец данных определяется закрытием соединения (FIN-пакет). Однако в прикладных протоколах (HTTP, SMTP) используются явные маркеры: пустая строка (CRLF) в HTTP-заголовках, точка на отдельной строке в SMTP (RFC 5321).
Применение в телекоммуникациях
Асинхронная последовательная передача
В стандарте RS-232 каждый байт данных обрамляется стартовым битом (логический 0) и одним или несколькими стоповыми битами (логическая 1). Стоповый бит гарантирует, что приёмник успеет синхронизироваться перед следующим байтом. Длительность стопового бита (1, 1,5 или 2 бита) выбирается в зависимости от скорости и качества линии.
Кадрирование в HDLC
В протоколе HDLC (High-Level Data Link Control, 1970-е годы) каждый кадр начинается и заканчивается флагом 0x7E. Если внутри кадра встречается байт 0x7E, он экранируется (вставляется 0x7D). Таким образом, флаг выполняет роль стопового символа, однозначно указывая границы кадра.
Проблемы и ограничения
Конфликт с данными
Если стоповый символ может встречаться внутри передаваемых данных, возникает проблема экранирования (escaping). Например, в строках C нельзя хранить нулевой байт, а в текстовых файлах DOS символ Ctrl+Z может быть частью двоичных данных. Решения: escape-последовательности (C: \0 для нуля, но не для хранения), длина строки в заголовке (Pascal), использование специальных флагов (HDLC).
Безопасность
Отсутствие или неправильная обработка стопового символа может привести к уязвимостям. Классический пример — переполнение буфера в C при отсутствии нулевого байта. В веб-приложениях некорректная обработка символа конца строки (CRLF) может вызвать инъекцию HTTP-заголовков (HTTP Response Splitting).
Переносимость
Разные операционные системы используют разные стоповые символы для конца строки: Windows — \r\n (CR+LF), Unix/Linux — \n (LF), классическая Mac OS (до 10.0) — \r (CR). Это приводит к проблемам при обработке текстовых файлов между платформами.
Интересные факты
- В языке программирования COBOL (1959 год) строки не завершаются стоповым символом — их длина фиксирована и задаётся при объявлении.
- В ранних версиях MS-DOS (1981 год) символ Ctrl+Z (0x1A) использовался не только для конца файла, но и для завершения ввода с клавиатуры.
- В протоколе USB (1996 год) стоповый символ отсутствует — данные передаются пакетами фиксированной длины с контрольной суммой.
- В языке Python (с 1991 года) конец файла при чтении из stdin обрабатывается исключением
EOFError, а не специальным символом. - В формате PNG (1996 год) стоповый символ не используется — конец файла определяется по длине, указанной в заголовке IHDR.
Источники
- Таненбаум Э., Уэзеролл Д. «Компьютерные сети». 5-е изд. — СПб.: Питер, 2012.
- Керниган Б., Ритчи Д. «Язык программирования C». 2-е изд. — М.: Вильямс, 2007.
- RFC 5321 — Simple Mail Transfer Protocol (2008).
- ISO 3309 — High-Level Data Link Control (HDLC) procedures (1993).
- «ASCII Control Characters» — American National Standards Institute, 1968.
- Документация GNU C Library — раздел «End-of-File and Errors».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →