using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DM_Weight.Common { public class CRC16MODBUS { /// Name: CRC-16/MODBUS x16+x15+x2+1 /// Poly: 0x8005 /// Init: 0xFFFF /// Refin: true /// Refout: true /// Xorout: 0x0000 ///******************************添加数据CRC16MODBUS校验位******************************************* public static byte[] CrcModBus(byte[] buffer, int start = 0, int len = 0) { if (buffer == null || buffer.Length == 0) return null; if (start < 0) return null; if (len == 0) len = buffer.Length - start; int length = start + len; if (length > buffer.Length) return null; ushort crc = 0xFFFF;// Initial value for (int i = start; i < length; i++) { crc ^= buffer[i]; for (int j = 0; j < 8; j++) { if ((crc & 1) > 0) crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005 else crc = (ushort)(crc >> 1); } } byte[] ret = BitConverter.GetBytes(crc); //Array.Reverse(ret); return ret; } } }