- nullで終了する文字列を必要とするサーバーと通信しています
- C#でこれをスマートに行うにはどうすればよいですか?
4 に答える
賢い方法はそれを簡単に行うことだと思います。
string str = "An example string" + char.MinValue; // Add null terminator.
次に、それをバイトに変換してサーバーに送信します。
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);
もちろん、使用するエンコーディングは、サーバーが期待するエンコーディングによって異なります。
文字列が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
。
文字列はすでに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配列は、作成時にすべてゼロで埋められるため、実際に余分なバイトをゼロに設定する必要はありません。)
文字列の最後にヌル文字を追加します。.NET文字列にはヌル文字を含めることができます。