/// <summary> /// Initializes the CRC-16 calculations. /// </summary> public override void Initialize() { if (this.definition.ReverseDataBytes) { this.remainder = HackersDelight.Reverse(this.definition.Initializer); } else { this.remainder = this.definition.Initializer; } }
/// <summary> /// Generates a lookup table for a CRC-16 algorithm definition. Both <see cref="Definition.TruncatedPolynomial"/> and <see cref="Definition.ReverseDataBytes"/> are used in the calculations. /// </summary> /// <param name="definition">The CRC-16 algorithm definition.</param> /// <returns>The lookup table.</returns> public static ushort[] GenerateLookupTable(Definition definition) { unchecked { ushort[] ret = new ushort[256]; byte dividend = 0; do { ushort remainder = 0; for (byte mask = 0x80; mask != 0; mask >>= 1) { if ((dividend & mask) != 0) { remainder ^= 0x8000; } if ((remainder & 0x8000) != 0) { remainder <<= 1; remainder ^= definition.TruncatedPolynomial; } else { remainder <<= 1; } } if (definition.ReverseDataBytes) { ret[HackersDelight.Reverse(dividend)] = HackersDelight.Reverse(remainder); } else { ret[dividend] = remainder; } ++dividend; }while (dividend != 0); return(ret); } }