如何在dart中生成校验和代码?

v64noz0r  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(303)

我想使用PayMaya EMV商家提出的QR码规范的支付系统一切都很好,除了CRC我不明白如何生成此代码.这是所有存在关于它,但我仍然不明白如何生成。应根据[ISO/IEC 13239]使用多项式“1021”计算校验和(十六进制)和初始值“FFFF”(十六进制)。用于计算校验和的数据应涵盖所有数据对象,包括其ID、长度和值,以其各自的顺序包含在QR代码中,以及CRC本身的ID和长度(但不包括其值)。
计算校验和后,应通过将每个半字节转换为字母数字特殊字符,将产生的2字节十六进制值编码为4字符字母数字特殊值。
示例:具有两字节十六进制值“007 B”的CRC作为“6304007 B”包含在QR代码中。

py49o6xq

py49o6xq1#

它将字符串转换为UTF-8表示形式的字节序列,并打印出这些字节的16位循环冗余校验(CRC-16/CCITT-FALSE)。

int crc16_CCITT_FALSE(String data) {
  int initial = 0xFFFF; // initial value
  int polynomial = 0x1021;   // 0001 0000 0010 0001  (0, 5, 12)

  Uint8List bytes = Uint8List.fromList(utf8.encode(data));

  for (var b in bytes) {
    for (int i = 0; i < 8; i++) {
      bool bit = ((b >> (7-i) & 1) == 1);
      bool c15 = ((initial >> 15 & 1) == 1);
      initial <<= 1;
      if (c15 ^ bit) initial ^= polynomial;
    }
  }

  return initial &= 0xffff;
}
r1wp621o

r1wp621o2#

ISO/IEC 13239的CRC为CRC-16/ISO-HDLC,如该目录中的注解所示。此操作实现该CRC并打印校验值0x906e

import 'dart:typed_data';

int crc16ISOHDLC(Uint8List bytes) {
  int crc = 0xffff;
  for (var b in bytes) {
    crc ^= b;
    for (int i = 0; i < 8; i++)
      crc = (crc & 1) != 0 ? (crc >> 1) ^ 0x8408 : crc >> 1;
  }
  return crc ^ 0xffff;
}

void main() {
  Uint8List msg = Uint8List.fromList([0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39]);
  print("0x" + crc16ISOHDLC(msg).toRadixString(16));
}

相关问题