public override void Decode(byte[] buffer, int offset, int length)
{
ConnectionId = ReadLong(buffer, ref offset);
if (Action != ReadInt(buffer, ref offset))
ThrowInvalidActionException();
TransactionId = ReadInt(buffer, ref offset);
Infohash = new InfoHash(ReadBytes(buffer, ref offset, 20));
PeerId = ReadString(buffer, ref offset, 20);
Downloaded = ReadLong(buffer, ref offset);
Left = ReadLong(buffer, ref offset);
Uploaded = ReadLong(buffer, ref offset);
TorrentEvent = (TorrentEvent) ReadInt(buffer, ref offset);
Ip = (uint) ReadInt(buffer, ref offset);
Key = (uint) ReadInt(buffer, ref offset);
NumWanted = ReadInt(buffer, ref offset);
Port = (ushort) ReadShort(buffer, ref offset);
}