Hola sandra68 no te vuelvas loca
, mira, al parecer, la mayoria de las operaciones que veo en la funcion son operaciones de bits, que a veces son un poco complejas de entender si no has tenido buenas bases de matematica para la computacion, tratare de explicarte nada mas la linea que dices no entender nada, pero te recomiendo que busques un libro de matematicas para computacion, o alguien de tu localidad que sepa mas, pues como dije antes seria dificil explicarte todo en un solo post
:
Primero que nada, las cantidades tienen un &H al principio, lo que significa que estan en hexadecimal, esto es para facilitar el manejo de los numeros, pero para entender como funciona, hay que ver esos mismos numeros en binario (0 y 1) pues en ese formato es como se entiende mejor como funcionan las operaciones entre bits.
El numero F es 15 en decimal, y en binario es 1111, o sea, que por cada F tu vas a poner 1111 en binario.
La operacion "and" se utiliza aqui para verificar que bits se encuentran encendidos (o sea, cuales son igual a 1), pues si tu tienes un numero cualquiera y le haces "and &HF", te regresara el mismo numero, pues recuerda que el "and" te devuelve 1, si los dos numeros son 1, y 0 en cualquier otro caso. O sea que si tenemos:
1010 and 1111
obtendremos 1010 de nuevo, pues cada digito, se compara con el digito del otro numero que este en la misma posicion (el primer digito del primer numero con el primer digito del segundo numero, el segundo digito del primer numero se compara con el segundo digito del segundo numero y asi sucesivamente)
La operacion "xor", se utiliza aqui para invertir los bits, pues si el primer digito es 1, se vuelve cero y viceversa, tomando como ejemplo los mismos numeros anteriores, si hacemos:
1010 xor 1111
obtendremos 0101
La funcion Mid(), se utiliza para extraer un caracter de una cadena, la funcion Asc() convierte ese mismo caracter en un numero, pues las operaciones de bits solo se pueden hacer con numeros, no con caracteres, y por ultimo la funcion CLng() convierte ese mismo numero a formato Long.
Entonces, resumiendo, basicamente la linea
i = CLng(Asc(Mid(trama, j, 1))) Xor ((dwCrc32) And &HFF&)
Hace lo siguiente:
Toma un caracter de una cadena, lo convierte a numero, checa que bits estan encendidos de ese numero, y luego los invierte, y guarda el resultado en la variable i.
Para complementar, te dejo la tabla de verdad de los operadores and, or, xor.
0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1
0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
Saludos y espero que te sirva la informacion
.