Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@israellot
Created September 26, 2022 15:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save israellot/acc5d980029bb88d42a31896e53e6fe4 to your computer and use it in GitHub Desktop.
Save israellot/acc5d980029bb88d42a31896e53e6fe4 to your computer and use it in GitHub Desktop.
Expert BigEndian Checksum
public static unsafe uint Checksum(ReadOnlySpan<byte> arr)
{
if (arr.Length == 0) return 0;
fixed (byte* ptr = arr)
{
uint sum = 0;
int z = 0;
var limit = arr.Length - 4;
while (z < limit)
{
sum += *(uint*)(ptr + z);
z += 4;
}
int rem = (arr.Length - z);
switch (rem & 3)
{
case 3:
sum += (uint)(ptr[z + 2]) << 8;
sum += (uint)(ptr[z + 1]) << 16;
sum += (uint)(ptr[z + 0]) << 24;
break;
case 2:
sum += (uint)(ptr[z + 1]) << 16;
sum += (uint)(ptr[z + 0]) << 24;
break;
case 1:
sum += (uint)(ptr[z + 0]) << 24;
break;
}
return sum;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment