Нулевой символ
Нулевой символ (также нулевой терминатор ) — это управляющий символ со значением ноль. [1] [2] [3] [4] Он присутствует во многих наборах символов , включая те, которые определены кодами Бодо и ITA2 , ISO/IEC 646 (или ASCII ), управляющим кодом C0 , универсальным набором кодированных символов (или Unicode ) и EBCDIC . Он доступен практически на всех основных языках программирования . [5] Его часто называют NUL (или NULL , хотя в некоторых контекстах этот термин используется для обозначения нулевого указателя ). В 8-битных кодах он известен как нулевой байт .
Первоначальное значение этого символа было похоже на NOP — при отправке на принтер или терминал он не оказывает никакого эффекта (однако некоторые терминалы неправильно отображают его как пробел ). Когда электромеханические телетайпы использовались в качестве компьютерных устройств вывода, в конце каждой печатной строки отправлялись один или несколько нулевых символов, чтобы дать механизму время вернуться в первую позицию печати в следующей строке. [ нужна ссылка ] На перфоленте символ представлен вообще без отверстий, поэтому новая неперфолента изначально заполнена нулевыми символами, и часто текст можно вставить в зарезервированное пространство с нулевыми символами, пробивая новые символы на ленту поверх нулевых символов. .
Сегодня этот символ имеет гораздо большее значение в языке программирования C и его производных, а также во многих форматах данных, где он служит зарезервированным символом, обозначающим конец строки . [6] часто называется строкой с нулевым завершением . [7] Это позволяет строке иметь любую длину с накладными расходами всего в один байт; альтернатива сохранению счетчика требует либо ограничения длины строки в 255, либо накладных расходов более одного байта (есть и другие преимущества/недостатки, описанные в статье о строках с нулевым завершением ).
Представительство [ править ]
В исходном коде нулевой символ часто представляется как escape-последовательность. \0
в строковых литералах (например, "abc\0def"
) или в символьных константах ( '\0'
); последнее также можно записать просто как 0
(без кавычек и косой черты). [8] Во многих языках ( например, C , где введена эта запись) это не отдельная escape-последовательность, а восьмеричная escape-последовательность с одной восьмеричной цифрой 0; как следствие, \0
после него не должно идти ни одной цифры 0
через 7
; в противном случае это интерпретируется как начало более длинной восьмеричной escape-последовательности. [9] Другие escape-последовательности, которые используются в разных языках: \000
, \x00
, \z
, или \u0000
. Нулевой символ можно поместить в URL-адрес с кодом процента. %00
.
Возможность представления нулевого символа не всегда означает, что результирующая строка будет правильно интерпретирована, поскольку многие программы считают нулевой символ концом строки. Таким образом, возможность ввести его (в случае непроверенного пользовательского ввода ) создает уязвимость, известную как внедрение нулевого байта , и может привести к уязвимостям безопасности. [10]
В обозначениях каретки нулевой символ ^@
. На некоторых клавиатурах можно ввести нулевой символ, удерживая нажатой кнопку Ctrl и нажатие @ (на макетах США просто Ctrl+ 2 часто будет работать, поскольку нет необходимости ⇧ Shift чтобы получить знак @).
Шестнадцатеричное : обозначение нуля 00
. Декодирование Base64 строки AA==
также дает нулевой символ.
В документации нулевой символ иногда представляется как символ одинарной ширины , содержащий буквы «NUL». В Юникоде для этого есть символ: U+2400 ␀ СИМВОЛ НУЛЯ .
Кодировка [ править ]
Во всех современных наборах символов нулевой символ имеет нулевое значение кодовой точки. В большинстве кодировок это преобразуется в одну кодовую единицу с нулевым значением. Например, в UTF-8 это один нулевой байт. Однако в модифицированном UTF-8 нулевой символ кодируется как два байта: 0xC0,0x80 . Это позволяет использовать байт со значением ноль, который теперь не используется ни для одного символа, в качестве терминатора строки.
Ссылки [ править ]
- ^ Формат ASCII для сетевого обмена . IETF . сек. 5.2. дои : 10.17487/RFC0020 . РФК 20 .
NUL (Null): символ «все нули», который может служить для заполнения времени и носителя.
- ^ «Набор управляющих символов ISO 646» (PDF) . Секретариат ISO/TC 97/SC 2. 1 декабря 1975 г. п. 4.4. Архивировано из оригинала (PDF) 12 мая 2014 г.
Позиция: 0/0, Имя: Null, Сокращение: Nul
- ^ «Символ Юникода 'NULL' (U+0000)» . Проверено 20 октября 2018 г.
- ^ «Элементы управления C0 и базовая латиница» (PDF) . Консорциум Юникод. 2018 . Проверено 20 октября 2018 г.
- ^ «Байт со всеми битами, установленными в 0, называемый нулевым символом , должен существовать в базовом наборе символов выполнения; он используется для завершения литерала строки символов». — ANSI/ISO 9899:1990 (стандарт ANSI C), раздел 5.2.1.
- ^ « Строка — это непрерывная последовательность символов, заканчивающаяся первым нулевым символом и включая его» — ANSI/ISO 9899:1990 (стандарт ANSI C), раздел 7.1.1
- ^ Рабочий проект стандарта языка программирования C++ (PDF) (рабочий проект стандарта ISO 14882), ISO / IEC , 28 февраля 2011 г., стр. 427, N3242=11-0012 , получено 27 февраля 2013 г. ,
Байтовая строка с нулевым завершением , или NTBS, представляет собой последовательность символов, элемент с наивысшим адресом которой с определенным содержимым имеет нулевое значение ( завершающий нулевой символ ); ни один другой элемент в последовательности не имеет нулевого значения.
- ^ Керниган и Ричи, С. , стр. 38: "Символовая константа '\0' представляет символ с нулевым значением, нулевой символ. '\0' часто пишется вместо 0, чтобы подчеркнуть символьную природу некоторого выражения, но числовое значение равно 0."} }
- ^ В YAML эта комбинация представляет собой отдельную escape-последовательность .
- ^ Раздел «Введение нулевого байта» Классификация угроз WASC. Раздел «Атака нулевого байта».
Внешние ссылки [ править ]
- Внедрение нулевых байтов. Классификация угроз WASC. Раздел «Атака нулевым байтом».
- Введение в Poison Null Byte Введение в атаку по нулевому байту
- Apple с внедрением нулевых байтов QR-кода Уязвимость