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

Шестнадцатеричная запись для null — . Декодирование строки Base64 также дает нулевой символ.00AA==

В документации нулевой символ иногда представлен как символ шириной в один em, содержащий буквы «NUL». В Unicode для этого есть символ: U+2400 СИМВОЛ ДЛЯ NULL .

Кодирование

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

Ссылки

  1. ^ Формат ASCII для сетевого обмена. IETF . Раздел 5.2. DOI : 10.17487/RFC0020 . RFC 20. NUL (Нуль): символ, состоящий из всех нулей, который может использоваться для заполнения времени и носителя.
  2. ^ "Набор управляющих символов ISO 646" (PDF) . Секретариат ISO/TC 97/SC 2. 1975-12-01. стр. 4.4. Архивировано из оригинала (PDF) 2014-05-12. Позиция: 0/0, Имя: Null, Аббревиатура: Nul
  3. ^ "Символ Unicode 'NULL' (U+0000)" . Получено 2018-10-20 .
  4. ^ "C0 Controls and Basic Latin" (PDF) . Unicode Consortium. 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: «Символьная константа '\0' представляет символ со значением ноль, нулевой символ. '\0' часто пишется вместо 0, чтобы подчеркнуть символьную природу некоторого выражения, но числовое значение — просто 0».}}
  9. ^ В YAML эта комбинация является отдельной escape-последовательностью.
  10. ^ Раздел «Классификация угроз WASC по внедрению нулевого байта».

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