質問

私は、外部のエンティティから受信バイトの配列を有します。それは固定サイズです。

:バイトは、バッファの残りのうちパッドに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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top