Нулевой символ - Null character

В нулевой символ (также нулевой терминатор) это управляющий персонаж с нулевым значением.[1][2][3][4]Он присутствует во многих наборы символов, в том числе определенные Бодо и ITA2 коды, ISO / IEC 646 (или же ASCII ), C0 контрольный код, то Универсальный набор кодированных символов (или же Unicode ), и EBCDIC. Он доступен почти во всех основных языки программирования.[5] Часто его сокращают как NUL (или же НОЛЬ хотя в некоторых контекстах этот термин используется для обозначения нулевой указатель, другой объект). В 8-битных кодах он известен как нулевой байт.

Первоначальное значение этого символа было похоже на NOP - при отправке в принтер или Терминал, он ничего не делает (однако некоторые терминалы неправильно отображают его как Космос ). Когда электромеханический телепринтеры были использованы в качестве компьютерных устройств вывода, один или несколько нулевых символов отправлялись в конце каждой напечатанной строки, чтобы дать время механизму вернуться к первой позиции печати на следующей строке.[нужна цитата ] На перфолента, символ представлен вообще без отверстий, поэтому новая неперфорированная лента изначально заполняется нулевыми символами, и часто текст может быть «вставлен» в зарезервированное пространство нулевых символов, вставляя новые символы на ленту поверх нулей.

Сегодня персонаж имеет гораздо большее значение в C и его производных и во многих форматах данных, где он служит зарезервированным символом, используемым для обозначения конца нить,[6] часто называют строка с завершающим нулем.[7] Это позволяет строке иметь любую длину с использованием только одного байта; Альтернатива хранения счетчика требует либо ограничения длины строки 255, либо служебных данных более одного байта (есть другие преимущества / недостатки, описанные в строка с завершающим нулем статья).

Представление

Нулевой символ часто представляется как escape-последовательность \0 в исходный код строковые литералы или символьные константы.[8] На многих языках (например, C, который ввел это обозначение), это не отдельная escape-последовательность, а восьмеричная escape-последовательность с одним восьмеричный цифра 0; как следствие, \0 не должно начинаться ни с одной из цифр 0 через 7; в противном случае это интерпретируется как начало более длинной восьмеричной escape-последовательности.[9] Другие escape-последовательности, которые используются в разных языках: \000, x00, z, или же u0000. Нулевой символ может быть помещен в URL с процентный код %00.

Возможность представлять нулевой символ не всегда означает, что результирующая строка будет правильно интерпретирована, так как многие программы будут рассматривать нулевой символ как конец строки. Таким образом, возможность набрать его (в случае непроверенный ввод пользователя ) создает уязвимость известный как инъекция нулевого байта и может привести к нарушениям безопасности.[10]

В обозначение каретки нулевой символ ^@. На некоторых клавиатурах можно ввести нулевой символ, удерживая Ctrl и нажимая @ (на макетах США просто Ctrl+2 часто будет работать, нет необходимости ⇧ Shift чтобы получить знак @).

В документации нулевой символ иногда представляется как однозначный.Эм -ширинный символ, содержащий буквы «NUL». В Unicode, есть символ с соответствующим глифом для визуального представления нулевого символа, «символ для нуля», U + 2400 (␀) - не путать с фактическим нулевым символом, U + 0000.

Кодирование

Во всех современных наборах символов нулевой символ имеет нулевое значение кодовой точки. В большинстве кодировок это преобразуется в одну кодовую единицу с нулевым значением. Например, в UTF-8 это единственный нулевой байт. Однако в Модифицированный UTF-8 нулевой символ кодируется двумя байтами: 0xC0, 0x80. Это позволяет использовать байт с нулевым значением, который теперь не используется ни для одного символа, в качестве признака конца строки.

Рекомендации

  1. ^ Формат ASCII для сетевого обмена. IETF. сек. 5.2. Дои:10.17487 / RFC0020. RFC 20. NUL (Null): символ из всех нулей, который может использоваться для заполнения по времени и медиа-заполнения.
  2. ^ «Набор управляющих символов стандарта ISO 646» (PDF). Секретариат ISO / TC 97 / SC 2. 1975-12-01. п. 4.4. Архивировано из оригинал (PDF) на 2014-05-12. Позиция: 0/0, Название: Null, Сокращение: Nul
  3. ^ «Символ Юникода 'NULL' (U + 0000)». Получено 2018-10-20.
  4. ^ «Элементы управления C0 и базовая латынь» (PDF). Консорциум Unicode. 2018 г.. Получено 2018-10-20.
  5. ^ "Байт, все биты которого установлены в 0, называемый нулевой символ, должен существовать в базовом наборе символов исполнения; он используется для завершения литерала символьной строки ». - ANSI / ISO 9899: 1990 (стандарт ANSI C), раздел 5.2.1
  6. ^ нить представляет собой непрерывную последовательность символов, заканчивающуюся первым нулевым символом и включающую в себя ее »- ANSI / ISO 9899: 1990 (стандарт ANSI C), раздел 7.1.1.
  7. ^ Рабочий проект стандарта языка программирования C ++ (PDF) (Рабочий проект стандарта ISO 14882), ISO /IEC, 28 февраля 2011 г., стр. 427, N3242 = 11-0012, получено 27 февраля 2013, А строка байтов с завершающим нулем, или NTBS, представляет собой последовательность символов, элемент которой с самым высоким адресом и определенным содержимым имеет нулевое значение ( завершающий нулевой символ); никакой другой элемент в последовательности не имеет нулевого значения.
  8. ^ Керниган и Ричи, C, п. 38
  9. ^ В YAML эта комбинация отдельная escape-последовательность.
  10. ^ Инъекция нулевого байта Раздел "Атака нулевого байта" классификации угроз WASC.

внешняя ссылка

  • Инъекция нулевого байта Раздел "Атака нулевым байтом" классификации угроз WASC
  • Poison Null Byte Введение Введение в Nullify 9
  • Байт Атака