static ushort ComputeChecksum (byte [] data)
{
uint ret = 0;
for (int i = 0; i < data.Length; i += 2) {
ushort us = i + 1 < data.Length ? data [i + 1] : (byte) 0;
us <<= 8;
us += data [i];
ret += us;
}
ret = (ret >> 16) + (ret & 0xFFFF);
return (ushort) ~ ret;
}