stringtranslate.com

Нулевой символ

Нулевой символ (также нулевой терминатор ) — это управляющий символ со значением ноль. [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нажатой клавишу (на американских раскладках часто работает просто + , поэтому для получения знака @ нет необходимости).@Ctrl2⇧ Shift

Шестнадцатеричное обозначение нуля : .00 Декодирование строки Base64AA== также дает нулевой символ.

В документации нулевой символ иногда представляется как символ одинарной ширины , содержащий буквы «NUL». В Юникоде для этого есть символ: U+2400 .

Кодирование

Во всех современных наборах символов нулевой символ имеет нулевое значение кодовой точки. В большинстве кодировок это преобразуется в одну кодовую единицу с нулевым значением. Например, в 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. 1 декабря 1975 г. п. 4.4. Архивировано из оригинала (PDF) 12 мая 2014 г. Позиция: 0/0, Имя: Null, Сокращение: Nul
  3. ^ «Символ Юникода 'NULL' (U + 0000)» . Проверено 20 октября 2018 г.
  4. ^ «Элементы управления C0 и базовая латиница» (PDF) . Консорциум Юникод. 2018 . Проверено 20 октября 2018 г.
  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. ^ Керниган и Ричи, С. , стр. 38: «Символовая константа '\0' представляет символ с нулевым значением, нулевой символ. '\0' часто пишется вместо 0, чтобы подчеркнуть символьную природу некоторых выражений, но числовое значение равно 0."} }
  9. ^ В YAML эта комбинация представляет собой отдельную escape-последовательность.
  10. ^ Раздел «Введение нулевого байта» Классификация угроз WASC. Раздел «Атака нулевого байта».

Внешние ссылки