0

http://www.daveoncsharp.com/2009/08/csharp-chat-application-over-asynchronous-udp-sockets-part-1のチュートリアルから 1 つのチャット アプリケーションを勉強しています。しかし、私には問題があります。「パケット クラス」では、「dataIdentifier」の「バイト単位のサイズ」が 4 、「名前の長さ」が 4 であることがわかっている理由を誰でも説明できます。パケット クラスの上部に説明がありますが、どうしてか分かりません。そしてこれら:

this.dataIdentifier = (DataIdentifier)BitConverter.ToInt32(dataStream, 0); // dataStream のインデックス 0 から変換しますが、どのように終了するか ???

int nameLength = BitConverter.ToInt32(dataStream, 4); // なぜ 4 から始まることがわかるのですか?

どうもありがとうございました。私の英語で申し訳ありません。

4

1 に答える 1

0

ネットワーク通信を扱う場合、ネットワーク接続はメッセージベースではなくストリームベースであるため、「メッセージ」が何であるかを定義する「プロトコル」を定義する必要があります。

したがって、議定書では次のように定義されています

説明 -> |dataIdentifier|名前の長さ|メッセージの長さ| 名前 | メッセージ |
サイズ (バイト単位) -> | 4 | 4 | 4 |名前の長さ|メッセージの長さ|

Aintは常に aSystem.Int32であり、aSystem.Int32を格納するには常に 4 バイトが必要です (32 を 8 で割ると 4 になります)。

これは、各列のデータ型を示す別の行です。おそらくそれが役立つでしょう

説明 -> |dataIdentifier|名前の長さ|メッセージの長さ| 名前 | メッセージ |
サイズ (バイト単位) -> | 4 | 4 | 4 |名前の長さ|メッセージの長さ|
データ型 -> | 整数 | 整数 | 整数 | 文字列 | 文字列 |

では、なぜビット コンバーターで 4 バイトをスキップするのでしょうか。

スキーマを元に戻しますが、今回はバイト数を示す数字を下げます

現在、最後の 2 つは「特別」であり、その長さは最初の 3 のような固定長ではなく、前の列から値を取得し、それが読み込まれるバイト数です。

説明 -> |dataIdentifier|名前の長さ|メッセージの長さ| 名前 | メッセージ |
サイズ (バイト単位) -> | 4 | 4 | 4 | 名前の長さ | メッセージの長さ |
バイト -> |0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 ~ (12 + 名前の長さ) | (12 + 名前の長さ) + 1 ~ ((12 + 名前の長さ) + 1 + メッセージの長さ) |

したがってdataIdentifier、インデックス 0 から開始して 4 バイトを読み取ることがわかります (これは、読み取るバイト数ですBitConverter.ToInt32)。次に、読み取りたい場合はnameLength、インデックス 4 から開始し、さらに 4 バイトを読み取る必要があります。これが、BitConverter.ToInt324 が渡される理由です (そしてmessageLength8 が渡されます)。

不明な点があればコメントで教えてください。詳しく説明します。

于 2013-09-16T17:05:42.177 に答える