今回はプロトコルバージョン578としてパケットを送ります。
まずは578をVarIntで表してみましょう。
VarIntでは、それぞれのbyteが 7bit の値と1bit のストップビットで構成されています。
javaっぽい擬似コードで表すと、以下のようにしてエンコードできます。
void writeVarInt (int value) {
for (;;) {
byte temp = (byte) ( value & 0x7F ) ; // 値から下位7ビットを取り出して byte にキャストする
value = value >>> 7 ; // 値を7ビット詰める。符号ビットはずらさないこと。
if (value != 0) // 値が0ではない、つまり残りがあるなら最上位ビットを1にする
temp = temp |= 0x80 ;
writeByte( temp ) ; // 値を1byte 送信する
if (value == 0) // 残りがなくなったら終わり
break;
}
}
まず、 578 を二進数に変換すると、 001001000010
(2)となる。
ここから下位7ビットを取り出して byte にキャストすると、 01000010
(2) が得られる。
001001000010
(2) を、下位7ビットを取り出した分ずらす(7ビットシフト)と、00100
(2) が残る。
残った値は 0 ではないので、01000010
(2) の最上位ビットを1にする。
そうすると、最初の 1バイト は11000010
(2) = 0xC2 になる。
残った値 00100
(2) から下位7ビットを取り出して byte にキャストすると、 00000100
(2) が得られる。
00100
(2) を、下位7ビットを取り出した分ずらす(7ビットシフト)と、0が残る。
残った値は 0 なので、次の 1バイト は 00000100
(2) = 0x04 になる。
これで終わり。
よって、578を VarInt で表すと、 C2 04 になります。