web-dev-qa-db-ja.com

C#で\ 0で終了する文字列を支援する

安全でないバイトバッファポインタを送信して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)";

だから明らかに私はそれを正しくやっていない、どうやって余分なものを取り除くのですか?

16
y2k

.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')));
34
John Fisher

変換でNULを削除するオプションがある場合があります。

それを超えて、あなたはおそらくそれを次のようにクリーンアップすることができます:

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

...または、一部のNULの後に非NUL文字が含まれている可能性があると思われる場合は、次の方が安全です。

int pos = s.IndexOf('\0');  
if (pos >= 0)
    s = s.Substring(0, pos);
6
Jason Williams
// 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
MrHIDEn

System.Runtime.InteropServices.Marshall.PtrToString*メソッドの1つはどうですか?

Marshal.PtrToStringAnsi-最初のヌル文字までのすべての文字をアンマネージANSI文字列からマネージ文字列にコピーし、各ANSI文字をUnicodeに拡張します。

Marshal.PtrToStringUni-マネージ文字列を割り当て、そのすべてまたは一部をアンマネージUnicode文字列の最初のnullにコピーします。

2
OldFart

最も安全な方法は、次を使用することです。

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

Asciiでは\ 0は「null」だと思います。取得している文字列は実際にASCIIでエンコードされていますか?

0
Jason M