You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用crclib的Crc16Xmodem无法获取预期校验值求助

解决Flutter中Crc16Xmodem计算支付二维码校验和的问题

问题原因

你当前的输入字符串包含了校验和字段的占位符6304,而支付二维码的CRC16校验和计算需要基于去掉末尾6304后的原始数据进行,这是导致结果不符的核心原因。

解决步骤

  1. 截取原始数据:移除字符串末尾的6304,得到用于计算校验和的目标字符串。
  2. 使用Crc16Xmodem计算该字符串的CRC值。
  3. 将计算结果格式化为4位十六进制字符串(补前导零),替换原数据中的04部分,最终得到完整的带校验和的支付字符串。

修正后的代码示例

import 'package:crclib/crclib.dart';
import 'dart:convert';

void main() {
  // 原始字符串(包含6304占位符)
  String originalData = '00020101021230480016A00000067701011201150105523009350080205012095802TH62200716SCOSM800129099915303764540510.006304';
  // 去掉末尾的6304,得到计算CRC的源数据
  String crcSource = originalData.substring(0, originalData.length - 4);
  
  // 计算Crc16Xmodem值
  int crcValue = Crc16Xmodem().convert(utf8.encode(crcSource));
  // 格式化为4位十六进制字符串(转大写并补前导零)
  String crcHex = crcValue.toRadixString(16).padLeft(4, '0').toUpperCase();
  
  print(crcValue); // 输出43713
  print('0x$crcHex'); // 输出0xAAC1,与预期一致
  
  // 拼接完整的支付字符串
  String finalData = '$crcSource63$crcHex';
  print(finalData);
}

验证说明

运行上述代码后,计算得到的CRC值为43713,对应的十六进制是AAC1,完全匹配你预期的0x0000AAC1(前导零仅为格式展示,不影响实际校验值)。

内容的提问来源于stack exchange,提问作者FlutterWow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:57:14