Как проверить CRC-16 гигантского шестнадцатеричного пакета в C # - PullRequest
0 голосов
/ 17 июня 2019

Я получаю шестнадцатеричный пакет с crc-16, поэтому мне нужно проверить, поврежден ли этот пакет или нет, я пытаюсь вычислить получатель на стороне CRC.Я написал некоторый код, который я предоставлю, но результатом этого являются бессмысленные значения.Так что я делаю не так?

Я получаю этот шестнадцатеричный пакет от беспроводного устройства, у меня есть код, который генерирует CRC, который прикреплен к пакету.Что мне нужно сделать, так это получить необходимую информацию из этого пакета и сохранить ее в базе данных, но сейчас моя проблема в проверке CRC.

public class CrcReceiver
{
    private static String polynom = "A001";


    //ToBinary method
    public static string hexToBinary(String hexString)
    {
        String binary = "";
        for (int i = 0; i < hexString.Length; i++)
        {
            binary = binary + Convert.ToString(Convert.ToInt32(hexString.Substring(i, 1), 16), 2).PadLeft(4, '0');
        }
        binary = binary.TrimStart('0');
        return binary;
    }

    public static String CrcCheck(String pacote)//passing the packet as parameter
    {
        String binaryPolynom;//binary polynom
        String binaryPacket;//binary packet
        String substring;
        int inicio = 0;//determines the start of the substring
        String xorResult;
        int diferenca = 0;//gets the difference between xorResult and binaryPolynom           
        int xorResultLength;

        binaryPacket = hexToBinary(pacote);

        binaryPolynom = hexToBinary(polynom);

        int polyLength = binaryPolynom.Length;

        substring = binaryPacket.Substring(inicio, polyLength);

        inicio += polyLength;          

        while (inicio < binaryPacket.Length)
        {
            xorResult = xor(substring, binaryPolynom);
            xorResult = xorResult.TrimStart('0');
            xorResultLength = xorResult.Length;

            if(xorResultLength < polyLength)
            {
                if ((polyLength - xorResultLength) + inicio <= binaryPacket.Length)
                {
                    diferenca = polyLength - xorResultLength;                 
                    substring = binaryPacket.Substring(inicio, diferenca);
                    inicio += diferenca;
                    xorResult += substring;
                }
                else
                {
                    substring = binaryPacket.Substring(inicio, (binaryPacket.Length - inicio));
                    inicio += substring.Length;
                    xorResult += substring;
                }
            }

            substring = xorResult;   

        }

        return xor(substring, binaryPolynom);
    }


    //Xor method
    private static String xor(String Element1, String Element2)
    {
        String novaString = "";

        for(int i = 0; i < Element1.Length; i++)
        {
            if(Element1[i] != Element2[i])
            {
                novaString += '1';
            }
            else
            {
                novaString += '0';
            }
        }

        return novaString;
    }

}

Код генерации CRC

public sealed class CRC
{
    private readonly int _polynom;

    public static readonly CRC Default = new CRC(0xA001);

    public CRC(int polynom)
    {
        _polynom = polynom;
    }

    public int CalcCrc16(byte[] buffer)
    {
        return CalcCrc16(buffer, 0, buffer.Length, _polynom, 0);
    }

    public static int CalcCrc16(byte[] buffer, int offset, int bufLen, int polynom, int preset)
    {
        preset &= 0xFFFF;
        polynom &= 0xFFFF;

        var crc = preset;
        for (var i = 0; i < bufLen; i++)
        {
            var data = buffer[(i + offset) % buffer.Length] & 0xFF;
            crc ^= data;
            for (var j = 0; j < 8; j++)
            {
                if ((crc & 0x0001) != 0)
                {
                    crc = (crc >> 1) ^ polynom;
                }
                else
                {
                    crc = crc >> 1;
                }
            }
        }
        return crc & 0xFFFF;
    }
}

1 Ответ

1 голос
/ 17 июня 2019

Начните с преобразования вашей шестнадцатеричной строки в байтовый массив, например так:

public static byte[] StringToByteArray(String hex)
{
  int NumberChars = hex.Length;
  byte[] bytes = new byte[NumberChars / 2];
  for (int i = 0; i < NumberChars; i += 2)
    bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
  return bytes;
}

Когда это массив байтов, вы можете запустить его через код CRC.

...