что такое ненулевая завершенная строка? - PullRequest
0 голосов
/ 05 июня 2018

Часть префикса "sz" важна, потому что некоторые строки в мире Windows (особенно когда речь идет о DDK) не заканчиваются нулем. чтение этого в разделе STR, LPSTR

Может кто-нибудь сказать мне, что это за строка с ненулевым символом в конце?

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Было бы проще ответить, когда мы можем использовать строки, не заканчивающиеся нулем.

Некоторые функции API принимают только указатель строки (SetWindowText, CreateFile), и строки должны заканчиваться нулевым символом.Другие функции (ExtTextOut, WriteConsole) принимают указатель и некоторую форму длины (обычно это число char с, TCHAR с или wchar_t с. Эти строки не должны заканчиваться нулевым символом.

// No termination NUL charcter bellow.
TCHAR hello[] = { 'H','E','L','L','O' };
ExtTextOut( hdc, 100, 100, 0, hello, 5, 0 );
TCHAR hello2[] = _T("HELLO WORLD!");
ExtTextOut( hdc, 100, 100, 0, hello2, 5, 0 );

В секунду ExtTextOut нам не нужно искусственно вырезать строку hello2 (или копировать ее во временный буфер). Эта функция позволяет использовать части строки без требования нулевого завершения.

0 голосов
/ 17 сентября 2018

В программировании ядра Windows наиболее часто используемый тип строки - UNICODE_STRING, тип строки с ненулевым символом в конце:

typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} UNICODE_STRING

Цель этой структуры данных - эффективная обработка строки вдоль драйверов стека.Каждый драйвер в стеке может добавлять текст или изменять строку в диапазоне «MaximumLenth» без выделения нового буфера.

Например, ниже приведена типичная строка Unicode, хранящаяся в непрерывном 64-байтовом буфере:

address + 0 : 22 (Length) 
address + 4 : 48 (MaximumLength)
address + 8 : buffer + 16 (Buffer)
address + 16: "Hello World" (UTF16 string, may without null terminated)

Стандартная функция управления строками не может использоваться в UNICODE_STRING, вместо этого вы должны использовать функции Rtl * UnicodeString ().

0 голосов
/ 05 июня 2018

В информатике строка - это последовательность символов .Последовательность имеет некоторую длину - в ней есть некоторое количество символов.Чтобы работать со строкой, обычно нужно знать длину строки.

Длина может указываться различными способами.Один из способов - указать конец последовательности с помощью значения Sentinel , которое является просто выбранным значением, которое не используется в последовательности.В символьных строках обычно используется ноль в качестве часового: строка продолжается от начала до тех пор, пока не будет найден нулевой символ.При использовании стража значение стража не может отображаться внутри строки, поскольку оно отмечает конец.

Другой способ указать длину - сохранить ее отдельно от строки.Например, длина передается подпрограмме C memcmp в качестве отдельного параметра.Это позволяет memcmp сравнивать произвольные последовательности байтов в памяти, включая последовательности, которые содержат нулевые байты.

Иногда длина рассматривается как часть структуры данных для строки.Это может быть первый байт или первые несколько байтов строки.Таким образом, программное обеспечение, использующее строку, получит длину, прочитав первый байт, а байты после этого будут содержать символы строки.

Другой метод, связанный с методом sentinel, заключается в использовании разделителей.Например, мы обычно пишем такие строки, как "abc", в исходном коде, тексте и в командах оболочки.Кавычки являются разделителями, которые отмечают начало и конец строк.Различные методы используются, чтобы позволить самим разделителям быть символами в строках, например, «заключать в кавычки» разделители с другими специальными символами, как в: "This is a quote mark: \".".

Таким образом, концепция строки, котораяне имеет нулевого конца, является широким и открытым: любой метод указания длины строки, кроме пометки конца нулевым символом, является строкой, не заканчивающейся нулевым символом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...