Foros del Web » Programación para mayores de 30 ;) » .NET »

CRC16 polinomio 0X8408 valor inicial 0xFFFF funcion

Estas en el tema de CRC16 polinomio 0X8408 valor inicial 0xFFFF funcion en el foro de .NET en Foros del Web. Hola les escribo por que necesito ayuda con un tema resulta que tengo un lector que enviá y recibe tramas con un checksum tipo CRC16, ...
  #1 (permalink)  
Antiguo 16/09/2015, 12:49
 
Fecha de Ingreso: julio-2015
Mensajes: 10
Antigüedad: 8 años, 9 meses
Puntos: 0
CRC16 polinomio 0X8408 valor inicial 0xFFFF funcion

Hola les escribo por que necesito ayuda con un tema resulta que tengo un lector que enviá y recibe tramas con un checksum tipo CRC16, en un manual que me envió el fabricante me dice que el polinomio 0X8408 valor inicial 0xFFFF. He intentado comprobar algunos crc con la pagina [URL="http://www.zorc.breitbandkatze.de/crc.html"]http://www.zorc.breitbandkatze.de/crc.html[/URL] pero no concuerda ninguno.
A continuación coloco algunos ejemplos de trama:

05 00 01 FB ( F2 3D) los últimos dos seria el checksum

04 00 01 (DB 4B)

esos ejemplos están en el manual y probando el lector con esos comandos funciona perfectamente el problema es que hay otros comandos a los cuales habría que agregarle el checksum y no se como obtenerlo.

Buscando encontré a alguien que había hecho algo parecido pero en C# y la verdad no estoy muy familiarizado con C# [URL="http://stackoverflow.com/questions/30496223/c-sharp-crc-16-ccitt-0x8408-polynomial-help-needed"]http://stackoverflow.com/questions/30496223/c-sharp-crc-16-ccitt-0x8408-polynomial-help-needed[/URL]

Código:
private ushort CCITT_CRC16(string strInput)
{
        ushort data;
        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) ^ 0x8408);
                else
                    crc >>= 1;
            }
        }
        crc = (ushort)~crc;
        data = crc;
        crc = (ushort)((crc << 8) ^ (data >> 8 & 0xFF));
        return crc;
}

he intentado realizar una traducción a VB


Código:
Private Sub crc16calc_Click(sender As Object, e As EventArgs) Handles crc16calc.Click

        Dim data As UShort = 0
        Dim crc As UShort = &HFFFF
        Dim pru() As Byte = {&H5, &H0, &H4, &HFB, &H4A, &H43}

        For j As UInteger = 0 To j < pru.Length
            crc = CUShort(crc ^ pru(j))
            For i As UInteger = 0 To i < 8
                If ((crc & &H1) = 1) Then
                    crc = CUShort((crc >> 1) ^ &H8408)
                Else
                    crc >>= 1
                End If

            Next

        Next


        crc = CUShort(Not crc)
        data = crc
        crc = CUShort((crc << 8) ^ (data >> 8 & &HFF))

        MsgBox(crc)

    End Sub

sin embargo el primer error es un desbordamiento (La operación aritmética ha provocado un desbordamiento.) en "crc = CUShort(crc ^ pru(j))". Agradecería su ayuda.

Etiquetas: net, vb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:36.