我有以下数据框:
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.
如果去掉前导
aa
,那么余数的这个CRC-16:
width=16 poly=0x8005 init=0x0000 refin=false refout=false xorout=0x0000 check=0xfee8 residue=0x0000 name="CRC-16/UMTS"
给
ef79
.
以下是我如何实现校验和计算:
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
}