Search code examples
c#crc16

What the lack of CRC-CCITT (0xFFFF)?


Based Online CRC calculation, when I entered hex string data =

503002080000024400003886030400000000010100

I get result CRC-CCITT (0xFFFF) =

0x354E (Expected Result)

.

I use the code below, but the results of CalcCRC16() are 0xACEE. What the lack of script below?

using System;
using System.Windows.Forms;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
using System.Diagnostics;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {

        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            string result = CalcCRC16("503002080000024400003886030400000000010100");            
            Debug.Print(result);
            // result = ACEE
            // result expected = 354E
        }

        // CRC-CCITT (0xFFFF) with poly 0x1021
        // input (hex string) =  "503002080000024400003886030400000000010100"
        // result expected (hex string) = "354E"
        public string CalcCRC16(string strInput) {
            ushort temp = 0;
            ushort crc = 0xFFFF;
            byte[] bytes = GetBytesFromHexString(strInput);
            for (int j = 0; j < bytes.Length; j++) {
                crc = (ushort)(crc ^ bytes[j]);
                for (int i = 0; i < 8; i++) {
                    if ((crc & 0x0001) == 1)
                        crc = (ushort)((crc >> 1) ^ 0x1021);
                    else
                        crc >>= 1;
                }
            }
            crc = (ushort)~(uint)crc;
            temp = crc;
            crc = (ushort)((crc << 8) | (temp >> 8 & 0xFF));
            return crc.ToString("X4");
        }

        public Byte[] GetBytesFromHexString(string strInput) {
            Byte[] bytArOutput = new Byte[] { };
            if (!string.IsNullOrEmpty(strInput) && strInput.Length % 2 == 0) {
                SoapHexBinary hexBinary = null;
                try {
                    hexBinary = SoapHexBinary.Parse(strInput);
                    if (hexBinary != null)
                        bytArOutput = hexBinary.Value;
                }
                catch (Exception ex) {
                    MessageBox.Show(ex.Message);
                }
            }
            return bytArOutput;
        }

    }
}

Solution

  • I found the answer and I will share here.. may be useful to others.

    strInput = 503002080000024400003886030400000000010100

    initial = 0xFFFF

    poly = 0x1021

    strOutput = 354E

    reference = Online CRC Calc

    public string CalcCRC16(string strInput) {
        ushort crc = 0xFFFF;
        byte[] data = GetBytesFromHexString(strInput);
        for (int i = 0; i < data.Length; i++) {
            crc ^= (ushort)(data[i] << 8);
            for (int j = 0; j < 8; j++) {
                if ((crc & 0x8000) > 0)
                    crc = (ushort)((crc << 1) ^ 0x1021);
                else
                    crc <<= 1;
            }
        }
        return crc.ToString("X4");
    }
    
    public Byte[] GetBytesFromHexString(string strInput) {
        Byte[] bytArOutput = new Byte[] { };
        if (!string.IsNullOrEmpty(strInput) && strInput.Length % 2 == 0) {
            SoapHexBinary hexBinary = null;
            try {
                hexBinary = SoapHexBinary.Parse(strInput);
                if (hexBinary != null) {
                    bytArOutput = hexBinary.Value;
                }
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
        return bytArOutput;
    }