Помогите с \ 0 завершенными строками в C # - PullRequest
14 голосов
/ 06 апреля 2010

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

Так что это дает мне

// 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)";

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

Ответы [ 5 ]

32 голосов
/ 06 апреля 2010

. 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')));
5 голосов
/ 06 апреля 2010

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

Помимо этого, вы, вероятно, можете очистить его с помощью:

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

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

int pos = s.IndexOf('\0');  
if (pos >= 0)
    s = s.Substring(0, pos);
2 голосов
/ 03 февраля 2016
// 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"
2 голосов
/ 06 апреля 2010

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

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

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

0 голосов
/ 06 апреля 2010

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

...