[Flutter] CRC16 From Dart

Programming/Flutter 2024. 3. 10. 16:06 Posted by 생각하는로뎅
반응형

 

flutter dart language

crc16 checksum

 

import 'dart:typed_data';

/// crc 16 체크 유틸
///
/// @author 임성진
class CRCCheckUtil {
  static Uint16List crcTable = Uint16List(256);
  static int polynomial = 0x8005;

  static int checkCrc16(List<int> bytes) {
    int crc = 0x0000;
    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;
  }

  /// checkSum
  /// @param data 검증 데이터
  /// @param checkCrc crc
  /// @return true : 성공, false 실패
  static bool checkSum(Uint8List data, Uint8List checkCrc) {
    int crc = checkCrc16(data);
    Uint8List bCrc = fnShortToBytes(crc, 1);
    if (bCrc[0] == checkCrc[0] && bCrc[1] == checkCrc[1]) {
      return true;
    } else {
      return false;
    }
  }

  static Uint8List fnShortToBytes(int value, int order) {
    Uint8List temp;
    temp = Uint8List.fromList([(value & 0xFF00) >> 8, value & 0x00FF]);
    temp = fnChangeByteOrder(temp, order);
    return temp;
  }

  static Uint8List fnChangeByteOrder(Uint8List value, int Order) {
    int idx = value.length;
    Uint8List Temp = Uint8List(idx);
    if (Order == 1) {
      Temp = value;
    } else if (Order == 0) {
      for (int i = 0; i < idx; i++) {
        Temp[i] = value[idx - (i + 1)];
      }
    }
    return Temp;
  }
}
반응형