2009-09-09 5 views
22

私はこれに似たバイト配列(16バイト)を持っている:バイト配列の文字列はC#でトリムされませんか?

71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00 

私はそれを文字列に変換し、終了のスペースをトリミングするためにこれを使用します。

ASCIIEncoding.ASCII.GetString(data).Trim(); 

私は、文字列は罰金を取得、しかし、それはまだすべての終了スペースを持っています。 だから、"qwerty.........."(ドットはStackOverflowのためにスペースです)のようなものがあります。

私は間違っていますか?

また、.TrimEnd()を使用してUTF8エンコーディングを使用しようとしましたが、何も変更されませんでした。事前に

感謝:)

+3

があなたのバイト配列は00バイトまたは20のバイトで終了していますか?スペースは0x20ではなく0x20です。 –

+1

あなたのバイト配列がMemoryStreamから来ている場合は、GetBufferに "未塗装"データが含まれているので、 '\ 0 'の –

答えて

31

あなたがこの問題を解決するためにTrimEnd(new char[] { (char)0 });を行う必要があります。スペースではありません。実際には変わって変換されるヌル文字です。私もこの問題を抱えていました。

System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0') 

...トリックを行う必要があります。

+6

ヌルターミネータは何も持たないので、' ToArray() 'を呼び出すと' GetBuffer ASCIIエンコーディングで行います。 @Lazloには、可変長のASCIIエンコード文字列を保持する固定サイズのバイト配列があるので、配列のサイズに合わせて文字列にヌルターミネータを埋めなければなりません。 – dtb

+0

@dtb:右。そうそう。 –

+0

ありがとうございました:)私はそれがこのようなものだと思っていましたが、試してみませんでした。 – Lazlo

20

彼らは本当にスペースはありません。

空白はchar.IsWhitespaceによって定義されているデフォルトremoves only whitespaceによる

7

トリム-Oisin。

'\0'は空白ではなく、制御文字です。

あなたはTrim(char[])オーバーロードを使用してトリミングするためにどの文字を指定することができますなぜ最初の文字列を作成しようと第二、それをトリミング

string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' }); 
1

?これにより、オーバーヘッドが大きくなる可能性があります(バイト[]が大きい場合)。

GetString(byte[] bytes, int index, int count)オーバーロードでは、indexcountを指定できます。

int count = data.Count(bt => bt != 0); // find the first null 
string result = Encoding.ASCII.GetString(data, 0, count); // Get only the characters you want 
0

PowerShellでは、あなたはこれを行うことができます。

$yourString.TrimEnd(0x00) 
関連する問題