SoloCodigo
Programación General => Visual Basic 6.0 e inferiores => Mensaje iniciado por: sandra68 en Domingo 3 de Julio de 2005, 23:25
-
Tengo que pasar un pequeño codigo de visual basic a c++. Pero no entiendo casi ninguna linea, vaya lio! :( Alguien me podria ayudar?? Se que s dificil. mil gracias.
Function CRC32(ByRef trama As String) As String
Dim dwCrc32 As Long
Dim i As Long
dwCrc32 = &HFFFFFFFF
Dim j As Integer, h As Integer
For j = 1 To Len(trama)
'sobre todo esta linea no entiendo nada, que devuelve esto?????
'i = CLng(Asc(Mid(trama, j, 1))) Xor ((dwCrc32) And &HFF&)
For h = 1 To 8
If (i And 1) Then
i = ((i And &HFFFFFFFE) / 2) Xor &HEDB88320
Else
i = (i And CLng(&HFFFFFFFE)) / 2
End If
Next h
dwCrc32 = ((dwCrc32 And &HFFFFFF00) / (2 ^ ) Xor i
Next j
'convertimos a representación hexadecimal con 8 digitos
Dim repHex As String
repHex = Hex$(dwCrc32)
If Len(repHex) = 8 Then
CRC32 = repHex
Else
'Colocamos símbolos "0" al principio de la cadena
CRC32 = String$(8 - Len(repHex), "0") & repHex
End If
End FunctionDE
-
Hola sandra68 no te vuelvas loca :P, 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 :rolleyes: :
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 B) .