QPacket Checksum Algorithm - zeroKilo/GROBackendWV GitHub Wiki
QPacket Checksum Algorithm
A single-byte checksum is appended to PRUDP packet, the calculating function in the binary is Quazal::Buffer::ComputeCheckSum
.
The algorithm may differ between different Quazal SDK versions.
Code
public static byte MakeChecksum(byte[] data, byte setting = 0xFF)
{
byte result = 0;
if (setting == 0xFF)
setting = GetProtocolSetting((byte)(data[0] >> 4));
uint tmp = 0;
for (int i = 0; i < data.Length / 4; i++)
tmp += BitConverter.ToUInt32(data, i * 4);
uint leftOver = (uint)data.Length & 3;
uint processed = 0;
byte tmp2 = 0, tmp3 = 0, tmp4 = 0;
uint pos = (uint)data.Length - leftOver;
if (leftOver >= 2)
{
processed = 2;
tmp2 = data[pos];
tmp3 = data[pos + 1];
pos += 2;
}
if (processed >= leftOver)
tmp4 = setting;
else
tmp4 = (byte)(setting + data[pos]);
result = (byte)((byte)(tmp >> 24) +
(byte)(tmp >> 16) +
(byte)(tmp >> 8) +
(byte)tmp + tmp2 + tmp3 + tmp4);
return result;
}