如何计算这个数据的校验和?

问题描述 投票:0回答:2

我有以下数据框:

AA3200010013000CAAAA000000000000000000043000010156EF79

“EF 79”应该是校验和。但我不太确定如何获得这个价值。

在文档中说:

Checksum: data CRC16 checksum except for frame head. The calibration algorithm adopts CCITT-16, calibration polynomials is X16 + X15 + X2 + 1, initiation value is set as 0.
flutter dart checksum crc16
2个回答
1
投票

如果去掉前导

aa
,那么余数的这个CRC-16:

width=16  poly=0x8005  init=0x0000  refin=false  refout=false  xorout=0x0000  check=0xfee8  residue=0x0000  name="CRC-16/UMTS"

ef79
.


0
投票

以下是我如何实现校验和计算:

int crc16umts(List<int> bytes) {
  int crc = 0x0000;
  const int polynomial = 0x8005;
  for (final byte in bytes) {
    crc ^= byte << 8;
    for (int i = 0; i < 8; i++) {
      if ((crc & 0x8000) != 0) {
        crc = (crc << 1) ^ polynomial;
      } else {
        crc <<= 1;
      }
    }
  }
  return crc & 0xFFFF;
}

void main() {
  final data = '3200010013000CAAAA000000000000000000043000010156';
  final bytes = List<int>.generate(
      data.length ~/ 2, (i) => int.parse(data.substring(i * 2, i * 2 + 2), radix: 16));
  final checksum = crc16umts(bytes);
  print(checksum.toRadixString(16).toUpperCase()); // EF79
}
© www.soinside.com 2019 - 2024. All rights reserved.