5

UDP 情報を受け取り、解析し、保存するためのパーサーに取り組んでいます。BinaryReaderそうするために、ほとんどがバイナリ情報になるため、を使用しています。ただし、一部は文字列になります。MSDN はReadString()関数について次のように述べています。

現在のストリームから文字列を読み取ります。文字列には長さが接頭辞として付けられ、一度に 7 ビットの整数としてエンコードされます。

そして、テストを開始するまで単に無視しようとした「一度に7ビット」まで完全に理解しています。に入れる前に独自のバイト配列を作成し、MemoryStreamで読み取ろうとしていBinaryReaderます。これが私が最初にうまくいくと思ったものです:

byte[] data = new byte[] { 3, 0, 0, 0, (byte)'C', (byte)'a', (byte)'t', }
BinaryReader reader = new BinaryReader(new MemoryStream(data));
String str = reader.ReadString();

an が 4 バイトであることを知っているint(そして、それがリトル エンディアンであることを知るのに十分な時間BinaryReaderいじくり回す) と、3 の長さと対応する文字を渡します。しかしstr、 を保持してしまい\0\0\0ます。3つのゼロを削除して、

byte[] data = new byte[] { 3, (byte)'C', (byte)'a', (byte)'t', }

Cat次に、適切に読み取り、保存します。私にとって、これは、長さが整数であるはずであるというドキュメントと矛盾しています。今では、データ型ではなく、小数点以下のない数値を単に意味していると思い始めていますintBinaryReaderこれは、aが 127 文字を超える文字列を読み取れないことを意味しますか(ドキュメントの 7 ビット部分に対応する 01111111 であるため)。

私はプロトコルを作成しており、ドキュメントをクライアントに渡す前に、何をしようとしているのかを完全に理解する必要があります。

4

2 に答える 2