ネットワーク通信を扱う場合、ネットワーク接続はメッセージベースではなくストリームベースであるため、「メッセージ」が何であるかを定義する「プロトコル」を定義する必要があります。
したがって、議定書では次のように定義されています
説明 -> |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.ToInt32
4 が渡される理由です (そしてmessageLength
8 が渡されます)。
不明な点があればコメントで教えてください。詳しく説明します。