Для первого набора байт подходит такой простой код:
static byte[] crc(byte[] data) {
ushort sum = 0;
foreach (byte b in data)
sum += b;
return new byte[] {(byte)(sum & 255), (byte)(sum >> 8)};
}
Те есть сумма всех байтов сообщения включая код операции и длину сообщения, но без чексуммы. То есть в документации косяк чексумма считается с 0 по 4+n без -1, n длина данных для команды. Но там ведь сказано, что чексумма это «сумма байтов пакета».
А вот собственно и полный тест:
static ushort crc(byte[] data, ushort sum = 0) {
foreach (byte b in data) sum += b;
return sum;
}
static void Main(string[] args)
{
// пакеты без чексумм
byte[] mass1 = new byte[] { 75, 0, 25, 0, 3, 48, 117, 0, 126, 37, 0, 188, 138, 169, 53, 66, 15, 52, 115, 203, 112, 103, 220, 16, 92, 237, 76, 80, 254};
byte[] mass2 = new byte[] { 75, 0, 25, 0, 3, 64, 156, 0, 126, 37, 0, 188, 138, 169, 245, 165, 14, 52, 115, 203, 96, 64, 220, 16, 92, 237, 76, 80, 254};
byte[] mass3 = new byte[] { 75, 0, 25, 0, 3, 80, 195, 0, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
byte[] mass4 = new byte[] { 75, 0, 25, 0, 3, 112, 17, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
byte[] mass5 = new byte[] { 75, 0, 25, 0, 3, 60, 134, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
foreach(var mass in new byte[][] {mass1, mass2, mass3, mass4, mass5}) {
bool first = true;
Console.Write("{");
foreach (var b in mass) {
if (!first) Console.Write(", ");
else first = false;
Console.Write(b);
}
var sum = BitConverter.GetBytes(crc(mass));
// вывод чексуммы
Console.WriteLine(", {0}, {1}}}", sum[0], sum[1]);
}
}