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;
}