19
  • nullで終了する文字列を必要とするサーバーと通信しています
  • C#でこれをスマートに行うにはどうすればよいですか?
4

4 に答える 4

51

賢い方法はそれを簡単に行うことだと思います。

string str = "An example string" + char.MinValue; // Add null terminator.

次に、それをバイトに変換してサーバーに送信します。

byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);

もちろん、使用するエンコーディングは、サーバーが期待するエンコーディングによって異なります。

于 2010-05-08T14:04:57.770 に答える
15

文字列がnullで終了している場合は、ある種のバイナリプロトコルを実装していると思います。使用していBinaryWriterますか?

デフォルトでBinaryWriterは、文字列は長さのプレフィックスとして書き込まれます。その動作を変更できます。

class MyBinaryWriter : BinaryWriter
{
    private Encoding _encoding = Encoding.Default;

    public override void Write(string value)
    {
        byte[] buffer = _encoding.GetBytes(value);
        Write(buffer);
        Write((byte)0);
    }
}

次に、次のような任意の文字列を記述できます。

using (MyBinaryWriter writer = new MyBinaryWriter(myStream))
{
    writer.Write("Some string");
}

_encoding必要に応じて、ビットを調整する必要がある場合があります。

もちろん、転送する必要のある他のデータ型の特定のニーズに合わせてクラスを拡張し、実際のプロトコル実装をきれいに保つことができます。おそらく、独自の(非常に類似した)ものも必要になりますBinaryReader

于 2010-05-08T09:54:24.440 に答える
7

文字列はすでにnullで終了しています。文字列自体にはヌル文字は含まれていませんが、メモリ内の文字列の後には常にヌル文字が続きます。

ただし、.NETの文字列はユニコードであるため、UTF-16 / UCS-2としてメモリに格納され、サーバーは別のエンコーディング(通常は8ビットエンコーディング)を予期する場合があります。次に、文字列をバイト配列にエンコードし、最後にゼロバイトを配置する必要があります。

byte[] data = Encoding.Default.GetBytes(theString);
byte[] zdata = new byte[data.Length + 1];
data.CopyTo(zdata, 0);

(zdata配列は、作成時にすべてゼロで埋められるため、実際に余分なバイトをゼロに設定する必要はありません。)

于 2010-05-08T09:51:42.673 に答える
5

文字列の最後にヌル文字を追加します。.NET文字列にはヌル文字を含めることができます。

于 2010-05-08T09:40:48.577 に答える