• Viernes 26 de Abril de 2024, 22:21

Autor Tema:  Me Estoy Volviendo Loca! Que Hace Esto??  (Leído 1175 veces)

sandra68

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Me Estoy Volviendo Loca! Que Hace Esto??
« en: Domingo 3 de Julio de 2005, 23:25 »
0
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

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Me Estoy Volviendo Loca! Que Hace Esto??
« Respuesta #1 en: Lunes 4 de Julio de 2005, 18:22 »
0
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) .

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================