2024年1月13日发(作者:)

63 /// Refin: true 64 /// Refout: true 65 /// Xorout: 0x00

66 ///************************************************************************* 67 public static byte[] Crc3(byte[] buffer, int start = 0, int len = 0) 68 { 69 if (buffer == null || == 0) return null; 70 if (start < 0) return null; 71 if (len == 0) len = - start; 72 int length = start + len; 73 if (length > ) return null; 74 byte crc = 0;// Initial value 75 for (int i = start; i < length; i++) 76 { 77 crc ^= buffer[i]; 78 for (int j = 0; j < 8; j++) 79 { 80 if ((crc & 1) > 0) 81 crc = (byte)((crc >> 1) ^ 0x15);// 0x15 = (reverse 0x15)>>(8-5) 82 else 83 crc = (byte)(crc >> 1); 84 } 85 } 86 return new byte[] { crc }; 87 } 88 /// ********************************************************************** 89 /// Name: CRC-5/USB x5+x2+1 90 /// Poly: 0x05 91 /// Init: 0x1F 92 /// Refin: true 93 /// Refout: true 94 /// Xorout: 0x1F

95 ///************************************************************************* 96 public static byte[] Crc4(byte[] buffer, int start = 0, int len = 0) 97 { 98 if (buffer == null || == 0) return null; 99 if (start < 0) return null;100 if (len == 0) len = - start;101 int length = start + len;102 if (length > ) return null;103 byte crc = 0x1F;// Initial value104 for (int i = start; i < length; i++)105 {106 crc ^= buffer[i];107 for (int j = 0; j < 8; j++)108 {109 if ((crc & 1) > 0)110 crc = (byte)((crc >> 1) ^ 0x14);// 0x14 = (reverse 0x05)>>(8-5)111 else112 crc = (byte)(crc >> 1);113 }114 }115 return new byte[] {(byte)( crc ^ 0x1F) };116 }117 /// **********************************************************************118 /// Name: CRC-6/ITU x6+x+1119 /// Poly: 0x03120 /// Init: 0x00121 /// Refin: true122 /// Refout: true123 /// Xorout: 0x00

124 ///*************************************************************************125 public static byte[] Crc5(byte[] buffer, int start = 0, int len = 0)126 {127 if (buffer == null || == 0) return null;128 if (start < 0) return null;129 if (len == 0) len = - start;130 int length = start + len;131 if (length > ) return null;132 byte crc = 0;// Initial value133 for (int i = start; i < length; i++)134 {135 crc ^= buffer[i];136 for (int j = 0; j < 8; j++)137 {138 if ((crc & 1) > 0)139 crc = (byte)((crc >> 1) ^ 0x30);// 0x30 = (reverse 0x03)>>(8-6)140 else141 crc = (byte)(crc >> 1);142 }143 }144 return new byte[] { crc };145 }146 /// **********************************************************************

147 /// Name: CRC-7/MMC x7+x3+1148 /// Poly: 0x09149 /// Init: 0x00150 /// Refin: false151 /// Refout: false152 /// Xorout: 0x00

153 ///*************************************************************************154 public static byte[] Crc6(byte[] buffer, int start = 0, int len = 0)155 {156 if (buffer == null || == 0) return null;157 if (start < 0) return null;158 if (len == 0) len = - start;159 int length = start + len;160 if (length > ) return null;161 byte crc = 0;// Initial value162 for (int i = start; i < length; i++)163 {164 crc ^= buffer[i];165 for (int j = 0; j < 8; j++)166 {167 if ((crc & 0x80) > 0)168 crc = (byte)((crc << 1) ^ 0x12);// 0x12 = 0x09<<(8-7)169 else170 crc = (byte)(crc << 1);171 }172 }173 return new byte[] { (byte)(crc >> 1) };174 }175 /// **********************************************************************176 /// Name: CRC8 x8+x2+x+1177 /// Poly: 0x07178 /// Init: 0x00179 /// Refin: false180 /// Refout: false181 /// Xorout: 0x00

182 ///*************************************************************************183 public static byte[] Crc7(byte[] buffer, int start = 0, int len = 0)184 {185 if (buffer == null || == 0) return null;186 if (start < 0) return null;187 if (len == 0) len = - start;188 int length = start + len;189 if (length > ) return null;190 byte crc = 0;// Initial value191 for (int i = start; i < length; i++)192 {193 crc ^= buffer[i];194 for (int j = 0; j < 8; j++)195 {196 if ((crc & 0x80) > 0)197 crc = (byte)((crc << 1) ^ 0x07);198 else199 crc = (byte)(crc << 1);200 }201 }202 return new byte[] { crc };203 }204 /// **********************************************************************205 /// Name: CRC-8/ITU x8+x2+x+1206 /// Poly: 0x07207 /// Init: 0x00208 /// Refin: false209 /// Refout: false210 /// Xorout: 0x55

211 ///*************************************************************************212 public static byte[] Crc8(byte[] buffer, int start = 0, int len = 0)213 {214 if (buffer == null || == 0) return null;215 if (start < 0) return null;216 if (len == 0) len = - start;217 int length = start + len;218 if (length > ) return null;219 byte crc = 0;// Initial value220 for (int i = start; i < length; i++)221 {222 crc ^= buffer[i];223 for (int j = 0; j < 8; j++)224 {225 if ((crc & 0x80) > 0)226 crc = (byte)((crc << 1) ^ 0x07);227 else228 crc = (byte)(crc << 1);229 }230 }

231 return new byte[] { (byte)(crc ^ 0x55) };232 }233 /// **********************************************************************234 /// Name: CRC-8/MAXIM x8+x5+x4+1235 /// Poly: 0x31236 /// Init: 0x00237 /// Refin: true238 /// Refout: true239 /// Xorout: 0x00

240 ///*************************************************************************241 public static byte[] Crc9(byte[] buffer, int start = 0, int len = 0)242 {243 if (buffer == null || == 0) return null;244 if (start < 0) return null;245 if (len == 0) len = - start;246 int length = start + len;247 if (length > ) return null;248 byte crc = 0;// Initial value249 for (int i = start; i < length; i++)250 {251 crc ^= buffer[i];252 for (int j = 0; j < 8; j++)253 {254 if ((crc & 1) > 0)255 crc = (byte)((crc >> 1) ^ 0x8C);// 0x8C = reverse 0x31

256 else257 crc = (byte)(crc >> 1);258 }259 }260 return new byte[] { crc };261 }262 /// **********************************************************************263 /// Name: CRC-8/ROHC x8+x2+x+1264 /// Poly: 0x07265 /// Init: 0xFF266 /// Refin: true267 /// Refout: true268 /// Xorout: 0x00

269 ///*************************************************************************270 public static byte[] Crc10(byte[] buffer, int start = 0, int len = 0)271 {272 if (buffer == null || == 0) return null;273 if (start < 0) return null;274 if (len == 0) len = - start;275 int length = start + len;276 if (length > ) return null;277 byte crc = 0xFF;// Initial value278 for (int i = start; i < length; i++)279 {280 crc ^= buffer[i];281 for (int j = 0; j < 8; j++)282 {283 if ((crc & 1) > 0)284 crc = (byte)((crc >> 1) ^ 0xE0);// 0xE0 = reverse 0x07285 else286 crc = (byte)(crc >> 1);287 }288 }289 return new byte[] { crc };290 }291 /// Z1协议校验码计算292 static byte[] table = { 0x00, 0x1C, 0x38, 0x24, 0x70, 0x6C, 0x48, 0x54, 0xE0, 0xFC,293 0xD8, 0xC4, 0x90, 0x8C, 0xA8, 0xB4, 0xDC, 0xC0, 0xE4, 0xF8,294 0xAC, 0xB0, 0x94, 0x88, 0x3C, 0x20, 0x04, 0x18, 0x4C, 0x50,295 0x74, 0x68, 0xA4, 0xB8, 0x9C, 0x80, 0xD4, 0xC8, 0xEC, 0xF0,296 0x44, 0x58, 0x7C, 0x60, 0x34, 0x28, 0x0C, 0x10, 0x78, 0x64,297 0x40, 0x5C, 0x08, 0x14, 0x30, 0x2C, 0x98, 0x84, 0xA0, 0xBC,298 0xE8, 0xF4, 0xD0, 0xCC, 0x54, 0x48, 0x6C, 0x70, 0x24, 0x38,299 0x1C, 0x00, 0xB4, 0xA8, 0x8C, 0x90, 0xC4, 0xD8, 0xFC, 0xE0,300 0x88, 0x94, 0xB0, 0xAC, 0xF8, 0xE4, 0xC0, 0xDC, 0x68, 0x74,301 0x50, 0x4C, 0x18, 0x04, 0x20, 0x3C, 0xF0, 0xEC, 0xC8, 0xD4,302 0x80, 0x9C, 0xB8, 0xA4, 0x10, 0x0C, 0x28, 0x34, 0x60, 0x7C,303 0x58, 0x44, 0x2C, 0x30, 0x14, 0x08, 0x5C, 0x40, 0x64, 0x78,304 0xCC, 0xD0, 0xF4, 0xE8, 0xBC, 0xA0, 0x84, 0x98, 0xA8, 0xB4,305 0x90, 0x8C, 0xD8, 0xC4, 0xE0, 0xFC, 0x48, 0x54, 0x70, 0x6C,306 0x38, 0x24, 0x00, 0x1C, 0x74, 0x68, 0x4C, 0x50, 0x04, 0x18,307 0x3C, 0x20, 0x94, 0x88, 0xAC, 0xB0, 0xE4, 0xF8, 0xDC, 0xC0,308 0x0C, 0x10, 0x34, 0x28, 0x7C, 0x60, 0x44, 0x58, 0xEC, 0xF0,309 0xD4, 0xC8, 0x9C, 0x80, 0xA4, 0xB8, 0xD0, 0xCC, 0xE8, 0xF4,310 0xA0, 0xBC, 0x98, 0x84, 0x30, 0x2C, 0x08, 0x14, 0x40, 0x5C,311 0x78, 0x64, 0xFC, 0xE0, 0xC4, 0xD8, 0x8C, 0x90, 0xB4, 0xA8,312 0x1C, 0x00, 0x24, 0x38, 0x6C, 0x70, 0x54, 0x48, 0x20, 0x3C,313 0x18, 0x04, 0x50, 0x4C, 0x68, 0x74, 0xC0, 0xDC, 0xF8, 0xE4,314 0xB0, 0xAC, 0x88, 0x94, 0x58, 0x44, 0x60, 0x7C, 0x28, 0x34,

399 if (buffer == null || == 0) return null;400 if (start < 0) return null;401 if (len == 0) len = - start;402 int length = start + len;403 if (length > ) return null;404 ushort crc = 0;// Initial value405 for (int i = start; i < length; i++)406 {407 crc ^= buffer[i];408 for (int j = 0; j < 8; j++)409 {410 if ((crc & 1) > 0)411 crc = (ushort)((crc >> 1) ^ 0x8408);// 0x8408 = reverse 0x1021412 else413 crc = (ushort)(crc >> 1);414 }415 }416 byte[] ret = es(crc);417 e(ret);418 return ret;419 }420 /// **********************************************************************421 /// Name: CRC-16/CCITT FALSE x16+x12+x5+1422 /// Poly: 0x1021423 /// Init: 0xFFFF424 /// Refin: false425 /// Refout: false426 /// Xorout: 0x0000

427 ///*************************************************************************428 public static byte[] Crc14(byte[] buffer, int start = 0, int len = 0)429 {430 if (buffer == null || == 0) return null;431 if (start < 0) return null;432 if (len == 0) len = - start;433 int length = start + len;434 if (length > ) return null;435 ushort crc = 0xFFFF;// Initial value436 for (int i = start; i < length; i++)437 {438 crc ^= (ushort)(buffer[i] << 8);439 for (int j = 0; j < 8; j++)440 {441 if ((crc & 0x8000) > 0)442 crc = (ushort)((crc << 1) ^ 0x1021);443 else444 crc = (ushort)(crc << 1);445 }446 }447 byte[] ret = es(crc);448 e(ret);449 return ret;450 }451 /// **********************************************************************452 /// Name: CRC-16/DNP x16+x13+x12+x11+x10+x8+x6+x5+x2+1453 /// Poly: 0x3D65454 /// Init: 0x0000455 /// Refin: true456 /// Refout: true457 /// Xorout: 0xFFFF

458 ///*************************************************************************459 public static byte[] Crc15(byte[] buffer, int start = 0, int len = 0)460 {461 if (buffer == null || == 0) return null;462 if (start < 0) return null;463 if (len == 0) len = - start;464 int length = start + len;465 if (length > ) return null;466 ushort crc = 0;// Initial value467 for (int i = start; i < length; i++)468 {469 crc ^= buffer[i];470 for (int j = 0; j < 8; j++)471 {472 if ((crc & 1) > 0)473 crc = (ushort)((crc >> 1) ^ 0xA6BC);// 0xA6BC = reverse 0x3D65474 else475 crc = (ushort)(crc >> 1);476 }477 }478 byte[] ret = es((ushort)~crc);479 e(ret);480 return ret;481 }482 /// **********************************************************************

483 /// Name: CRC-16/IBM x16+x15+x2+1484 /// Poly: 0x8005485 /// Init: 0x0000486 /// Refin: true487 /// Refout: true488 /// Xorout: 0x0000

489 ///*************************************************************************490 public static byte[] Crc16(byte[] buffer, int start = 0, int len = 0)491 {492 if (buffer == null || == 0) return null;493 if (start < 0) return null;494 if (len == 0) len = - start;495 int length = start + len;496 if (length > ) return null;497 ushort crc = 0;// Initial value498 for (int i = start; i < length; i++)499 {500 crc ^= buffer[i];501 for (int j = 0; j < 8; j++)502 {503 if ((crc & 1) > 0)504 crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005505 else506 crc = (ushort)(crc >> 1);507 }508 }509 byte[] ret = es(crc);510 e(ret);511 return ret;512 }513 /// **********************************************************************514 /// Name: CRC-16/MAXIM x16+x15+x2+1515 /// Poly: 0x8005516 /// Init: 0x0000517 /// Refin: true518 /// Refout: true519 /// Xorout: 0xFFFF

520 ///*************************************************************************521 public static byte[] Crc17(byte[] buffer, int start = 0, int len = 0)522 {523 if (buffer == null || == 0) return null;524 if (start < 0) return null;525 if (len == 0) len = - start;526 int length = start + len;527 if (length > ) return null;528 ushort crc = 0;// Initial value529 for (int i = start; i < length; i++)530 {531 crc ^= buffer[i];532 for (int j = 0; j < 8; j++)533 {534 if ((crc & 1) > 0)535 crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005

536 else537 crc = (ushort)(crc >> 1);538 }539 }540 byte[] ret = es((ushort)~crc);541 e(ret);542 return ret;543 }544 /// **********************************************************************545 /// Name: CRC-16/MODBUS x16+x15+x2+1546 /// Poly: 0x8005547 /// Init: 0xFFFF548 /// Refin: true549 /// Refout: true550 /// Xorout: 0x0000

551 ///*************************************************************************552 public static byte[] Crc18(byte[] buffer, int start = 0, int len = 0)553 {554 if (buffer == null || == 0) return null;555 if (start < 0) return null;556 if (len == 0) len = - start;557 int length = start + len;558 if (length > ) return null;559 ushort crc = 0xFFFF;// Initial value560 for (int i = start; i < length; i++)561 {562 crc ^= buffer[i];563 for (int j = 0; j < 8; j++)564 {565 if ((crc & 1) > 0)566 crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005

567 else568 crc = (ushort)(crc >> 1);569 }570 }

571 byte[] ret = es(crc);572 e(ret);573 return ret;574 }575 /// **********************************************************************576 /// Name: CRC-16/USB x16+x15+x2+1577 /// Poly: 0x8005578 /// Init: 0xFFFF579 /// Refin: true580 /// Refout: true581 /// Xorout: 0xFFFF

582 ///*************************************************************************583 public static byte[] Crc19(byte[] buffer, int start = 0, int len = 0)584 {585 if (buffer == null || == 0) return null;586 if (start < 0) return null;587 if (len == 0) len = - start;588 int length = start + len;589 if (length > ) return null;590 ushort crc = 0xFFFF;// Initial value591 for (int i = start; i < length; i++)592 {593 crc ^= buffer[i];594 for (int j = 0; j < 8; j++)595 {596 if ((crc & 1) > 0)597 crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005598 else599 crc = (ushort)(crc >> 1);600 }601 }602 byte[] ret = es((ushort)~crc);603 e(ret);604 return ret;605 }606 /// **********************************************************************607 /// Name: CRC-16/X25 x16+x12+x5+1

608 /// Poly: 0x1021609 /// Init: 0xFFFF610 /// Refin: true611 /// Refout: true612 /// Xorout: 0xFFFF

613 ///*************************************************************************614 public static byte[] Crc20(byte[] buffer, int start = 0, int len = 0)615 {616 if (buffer == null || == 0) return null;617 if (start < 0) return null;618 if (len == 0) len = - start;619 int length = start + len;620 if (length > ) return null;621 ushort crc = 0xFFFF;// Initial value622 for (int i = start; i < length; i++)623 {624 crc ^= buffer[i];625 for (int j = 0; j < 8; j++)626 {627 if ((crc & 1) > 0)628 crc = (ushort)((crc >> 1) ^ 0x8408);// 0x8408 = reverse 0x1021629 else630 crc = (ushort)(crc >> 1);631 }632 }633 byte[] ret = es((ushort)~crc);634 e(ret);635 return ret;636 }637 /// **********************************************************************638 /// Name: CRC-16/XMODEM x16+x12+x5+1

639 /// Poly: 0x1021640 /// Init: 0x0000641 /// Refin: false642 /// Refout: false643 /// Xorout: 0x0000

644 ///*************************************************************************645 public static byte[] Crc21(byte[] buffer, int start = 0, int len = 0)646 {647 if (buffer == null || == 0) return null;648 if (start < 0) return null;649 if (len == 0) len = - start;650 int length = start + len;