Подтвердить что ты не робот

Помощь с \0 завершаемыми строками в С#

Я использую низкоуровневый API-интерфейс, где я отправляю небезопасный буферный указатель буфера, чтобы получить значение c-string.

Итак, это дает мне

// using byte[255] c_str
string s = new string(Encoding.ASCII.GetChars(c_str));

// now s == "heresastring\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(etc)";

Итак, очевидно, что я не делаю это правильно, как я избавляюсь от избытка?

4b9b3361

Ответ 1

Строки .NET не заканчиваются на нуль (как вы, возможно, догадались). Таким образом, вы можете лечить "\ 0", так как вы будете относиться к любому нормальному персонажу. Обычная манипуляция строками поможет вам в этом. Вот некоторые (но не все) варианты.

s = s.Trim('\0');

s = s.Replace("\0", "");

var strings =  s.Split(new char[] {'\0'}, StringSplitOptions.RemoveEmptyEntries);

Если вы определенно хотите выбросить любые значения после первого нулевого символа, это может сработать лучше для вас. Но будьте осторожны, он работает только с строками, которые фактически включают нулевой символ.

s = s.Substring(0, Math.Max(0, s.IndexOf('\0')));

Ответ 2

В преобразовании может быть опция для удаления NUL.

Кроме того, вы могли бы, возможно, очистить его:

s = s.Trim('\0');

... или, если вы считаете, что после некоторых NUL могут быть символы, отличные от NUL, это может быть более безопасным:

int pos = s.IndexOf('\0');  
if (pos >= 0)
    s = s.Substring(0, pos);

Ответ 3

// s == "heresastring\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(etc)"    
s = s.Split(new[] { '\0' }, 2)[0];
// s == "heresastring"

Ответ 4

Как насчет одного из методов System.Runtime.InteropServices.Marshall.PtrToString*?

Marshal.PtrToStringAnsi - копирует все символы вплоть до первого нулевого символа из неуправляемой строки ANSI в управляемую строку и расширяет каждый символ ANSI до Unicode.

Marshal.PtrToStringUni - выделяет управляемую строку и копирует всю или часть в первый нуль неуправляемой строки Юникода в нее.

Ответ 5

Я верю, что \0 - "null" в ascii - вы уверены, что строка, которую вы получаете, на самом деле кодируется ascii?

Ответ 6

Самый безопасный способ - использовать:

s = s.Replace("\0", "");