private dynamic PackageParse(byte[] bytes) { dynamic package = new ExpandoObject(); if (bytes == null || bytes.Length < 4) { package.success = false; package.error = "не достаточно данных"; return(package); } if (Crc16Modbus.CrcCheck(bytes)) { var skip = bytes[0] == 0 ? 3 : 1; package.body = bytes.Skip(skip).Take(bytes.Length - (skip + 2)).ToArray(); package.code = 1; } else if (Crc16Modbus.CrcCheck(bytes, true)) { var skip = bytes[0] == 0 ? 3 : 1; package.body = bytes.Skip(skip).Take(bytes.Length - (skip + 2)).ToArray(); package.code = bytes[skip]; } else { package.success = false; package.error = "не сошлась контрольная сумма"; return(package); } package.success = true; package.error = string.Empty; return(package); }
public byte[] MakePackage(byte code, byte[] data) { //// byte[] frame = new byte[data.Length + 4]; frame[0] = (byte)(frame.Count()); frame[1] = code; //содержимое (со 2 по предпоследний байты) Array.Copy(data, 0, frame, 2, data.Length); //контрольная сумма var reverse = code != 1 && code != 2; var crc = Crc16Modbus.CrcCalculate(frame.Take(frame.Length - 2).ToArray(), reverse); frame[frame.Length - 2] = crc[0]; frame[frame.Length - 1] = crc[1]; return(frame); }