安全でないバイトバッファポインタを送信してc-string値を取得する低レベルのネイティブAPIを使用しています。
だからそれは私に
// 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)";
だから明らかに私はそれを正しくやっていない、どうやって余分なものを取り除くのですか?
.NET文字列はnullで終了しません(これから推測できるように)。したがって、「\ 0」は、通常の文字と同じように扱うことができます。通常の文字列操作で問題が解決します。ここにいくつかの(すべてではない)オプションがあります。
s = s.Trim('\0');
s = s.Replace("\0", "");
var strings = s.Split(new char[] {'\0'}, StringSplitOptions.RemoveEmptyEntries);
最初のヌル文字の後の値を確実に破棄したい場合は、これがうまくいく可能性があります。ただし、実際にはnull文字を含む文字列でのみ機能することに注意してください。
s = s.Substring(0, Math.Max(0, s.IndexOf('\0')));
変換でNULを削除するオプションがある場合があります。
それを超えて、あなたはおそらくそれを次のようにクリーンアップすることができます:
s = s.Trim('\0');
...または、一部のNULの後に非NUL文字が含まれている可能性があると思われる場合は、次の方が安全です。
int pos = s.IndexOf('\0');
if (pos >= 0)
s = s.Substring(0, pos);
// 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"
System.Runtime.InteropServices.Marshall.PtrToString*
メソッドの1つはどうですか?
Marshal.PtrToStringAnsi
-最初のヌル文字までのすべての文字をアンマネージANSI文字列からマネージ文字列にコピーし、各ANSI文字をUnicodeに拡張します。
Marshal.PtrToStringUni
-マネージ文字列を割り当て、そのすべてまたは一部をアンマネージUnicode文字列の最初のnullにコピーします。
最も安全な方法は、次を使用することです。
s = s.Replace("\0", "");
Asciiでは\ 0は「null」だと思います。取得している文字列は実際にASCIIでエンコードされていますか?