20

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

明らかに、私はそれを正しく行っていません。どうすれば余分なものを取り除くことができますか?

4

7 に答える 7

41

.NET 文字列は null で終了しません (このことから推測できるように)。したがって、'\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')));
于 2010-04-05T21:48:20.337 に答える
6

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

それを超えて、おそらく次の方法でクリーンアップできます。

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

...または、いくつかの NUL の後に非 NUL 文字があると思われる場合は、これがより安全かもしれません:

int pos = s.IndexOf('\0');  
if (pos >= 0)
    s = s.Substring(0, pos);
于 2010-04-05T21:44:10.867 に答える
5
// 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"
于 2016-02-03T16:20:09.833 に答える
3

方法の一つとしていかがSystem.Runtime.InteropServices.Marshall.PtrToString*でしょうか。

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

Marshal.PtrToStringUni- 管理された文字列を割り当て、管理されていない Unicode 文字列の最初の null のすべてまたは一部をそれにコピーします。

于 2010-04-05T22:00:11.910 に答える
0

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

于 2010-04-05T21:39:14.587 に答える