ヌルSystem.Text.Encoding.Unicode.GetStringから文字列を終了しましょう
質問
私は、外部のエンティティから受信バイトの配列を有します。それは固定サイズです。
:バイトは、バッファの残りのうちパッドに0の値を持つUnicode文字列を含みますだから、バイトは次のようになります。
H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc
私はそのバッファを取得し、そのような文字列に変換しています:
byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
String cmd = System.Text.Encoding.Unicode.GetString(buffer);
私は何を取り戻すことは、このように見える文字列は、次のとおりです。
"HELLO\0\0\0\0\0\0\0\0..."
どのように私は(つまり、私はちょうど「HELLO」取り戻す)最初のUnicode文字のヌルで文字列を終了するためのGetStringを伝えることができますか?
任意の入力いただきありがとうございます。
解決
あなたは残りの部分はすべて\ 0であることを確認している場合、これは動作します:
cmd = cmd.TrimEnd('\0');
それ以外の場合は、あなただけの最初のヌルの前にすべてを取得したい場合:
int index = cmd.IndexOf('\0');
if (index >= 0)
cmd = cmd.Remove(index);
Unicode.GetString
はダブル\ 0の世話をすることに注意してください。あなたは1つだけ\ 0を探す必要があります。
他のヒント
最も簡単な方法は、すでに示唆したように、変換後の文字列をトリミングすることです。
あなたは事前に文字カウントを知っている場合は、、あなたはトリミングせずに、正しい文字列を取得するためには、開始インデックスとバイトのカウントを取るのGetStringオーバーロードを使用することができます。
あなたは事前に文字カウントを知らないと、その後の文字列をトリミング避けたい場合は、、あなたは唯一の興味のあるバイトを渡すので、最初のバイト配列をトリミングする必要があります。ユニコードの場合、これは意味します後の任意のバイトを除去し、ゼロの最初のペアを含みます。
むしろ文字列を再処理するよりも、あなたは(System.Array.IndexOf
を使用して)バッファ内のNULLバイトの最初の発生を得ることができます。その後、与えられたバッファサイズまでの文字列を作成するために、オーバーロードさSystem.Text.Encoding.Unicode.GetString
メソッドを使用することができます。
以下の例はまた、ヌルバイトを含まないバッファに応え
byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
var size = System.Array.IndexOf(buffer, (byte)0);
String cmd = System.Text.Encoding.Unicode.GetString(buffer, 0, size < 0 ? buffSize : size);