package com.espressif.iot.esptouch.util; import java.util.zip.Checksum; public class CRC8 implements Checksum { private static final short[] crcTable = new short[256]; private static final short CRC_POLYNOM = 0x8c; private static final short CRC_INITIAL = 0x00; static { for (int dividend = 0; dividend < 256; dividend++) { int remainder = dividend;// << 8; for (int bit = 0; bit < 8; ++bit) if ((remainder & 0x01) != 0) remainder = (remainder >>> 1) ^ CRC_POLYNOM; else remainder >>>= 1; crcTable[dividend] = (short) remainder; } } private final short init; private short value; public CRC8() { this.value = this.init = CRC_INITIAL; } @Override public void update(byte[] buffer, int offset, int len) { for (int i = 0; i < len; i++) { int data = buffer[offset + i] ^ value; value = (short) (crcTable[data & 0xff] ^ (value << 8)); } } /** * Updates the current checksum with the specified array of bytes. * Equivalent to calling update(buffer, 0, buffer.length). * * @param buffer the byte array to update the checksum with */ public void update(byte[] buffer) { update(buffer, 0, buffer.length); } @Override public void update(int b) { update(new byte[]{(byte) b}, 0, 1); } @Override public long getValue() { return value & 0xff; } @Override public void reset() { value = init; } }