Как получить байты, включая нулевой символ завершения, из строки?

Привет StackOverflowers,

Я где-то читал, что строка С# не заканчивается нулем. М хорошо ! Но я хотел бы знать, если метод:

byte[] myBytes = Encoding.ASCII.GetBytes(myString);

добавить нулевой символ завершения в конец массива или мне нужно сделать это вручную? (системе C, которая будет использовать этот массив, он нужен).

Если вручную, я думаю, путь был бы таким:

byte[] myBytes = Encoding.ASCII.GetBytes(myString + '\0');

Данные должны быть в формате ASCII, не беспокойтесь о кодировке.


person Kinxil    schedule 17.07.2018    source источник
comment
Если ваш вопрос по существу сводится к тому, как правильно маршалировать строку в неуправляемый код, ожидающий строку с нулевым завершением? тогда вам доступны совершенно другие варианты и ответы.   -  person Lasse V. Karlsen    schedule 17.07.2018
comment
Вы передаете это неуправляемой функции через P/Invoke? Потому что если это так, есть вероятность, что вы делаете это неправильно... Символ NUL будет добавлен автоматически, если вы правильно объявите свой P/Invoke.   -  person Matthew Watson    schedule 17.07.2018


Ответы (4)



добавить нулевой символ завершения в конец массива или если я должен сделать это вручную

TL;DR — это зависит от обстоятельств. Вам это не нужно для чистой разработки .NET. Если вы собираетесь использовать p-invoke для нативного кода, .NET сделает перевод за вас, так что опять же, вы этого не сделаете.


Я где-то читал, что строка С# не завершается нулем

Верный.

MSDN:

Строка — это объект типа String, значением которого является текст. Внутри текст хранится как последовательная коллекция объектов Char, доступная только для чтения. В конце строки C# нет завершающего нуля символа; поэтому строка C# может содержать любое количество внедренных нулевых символов ('\0'). Свойство Length строки представляет количество содержащихся в ней объектов Char, а не количество символов Unicode. - Подробнее…

OP:

Но я хотел бы знать, добавляет ли метод byte[] myBytes = Encoding.ASCII.GetBytes(myString); нулевой символ завершения в конец массива или я должен сделать это вручную

Нет, и вам это не нужно, если, конечно, вы не хотите передать строку в собственный код через p-invoke, но это совершенно другой вопрос (и в любом случае обрабатывается для вас .NET).

person MickyD    schedule 17.07.2018

Это не добавляет, ваш второй код будет работать.

byte[] myBytes = 
         Encoding.ASCII.GetBytes("A"); // gives {65}

byte[] myBytes = 
    Encoding.ASCII.GetBytes("A"+"\0"); // gives {65, 0}
person Magnetron    schedule 17.07.2018

GetBytes не добавляет завершающий нулевой символ. Согласно этот ответ SO, вы можете просто добавить char.MinValue в конец строки.

byte[] myBytes = Encoding.ASCII.GetBytes(myString + char.MinValue);
person Lews Therin    schedule 17.07.2018

Из MSDN

Ваши приложения Unicode всегда должны приводить ноль к TCHAR при использовании строк с завершающим нулем.

Итак, чтобы получить строку с завершающим нулем, мы должны добавить байт в конце с помощью этого кода. Значение по умолчанию byte равно 0.

byte[] bytes= Encoding.Default.GetBytes(myString);
byte[] bytesNull = new byte[bytes.Length + 1];
bytes.CopyTo(bytesNull , 0);
person Antoine V    schedule 17.07.2018