-
Notifications
You must be signed in to change notification settings - Fork 7
QPacket Checksum Algorithm
michal-kapala edited this page Sep 10, 2021
·
4 revisions
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.
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;
}