Помощь с \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)";
Итак, очевидно, что я не делаю это правильно, как я избавляюсь от избытка?
Ответы
Ответ 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", "");