| Colabora |
Código Hamming[por elMesero]
Fecha: 23/Dic/2008 (16-12-08)
|
IntroducciónTareas y mas tareas, uff, despues de tiempo que vuelvo a colaborar algo xD, pues me la pase meditando y dizque estudiando (veladas de Dota, tragos y otras delicias de la vida jeje), weno, como es de costumbre en la universidad nos dejan alguna que otra cosa interesante, pues este es uno de los pocos casos, uno de mis profes, (LFL), dejo de trabajo dos temas para investigar de forma grupal (2), del cual solo expondriamos uno, que son el CRC (Código de Redundancia Ciclica) ó el Código Hamming, creo que ya se dieron cuenta cual escogi, o.O, ambos para protección de datos, weno, pequeña protección de datos mientras esta data atraviesa miles de kilometros de cable propenso a la interferencia electromagnetica, etc etc, para no entrar en detalles, aqui dejo nuestro trabajo, que es solo la implementacion de un algoritmo ya conocido. Nota: Nota: Del formulario:
Bueno, ante todo me guie de la informacion que brinda el Wikipedia, es el mismo ejemplo que plantean ahi, procedere a explicar un poco como trabaja este algoritmo, de ante mano, les pediria que revisen el Codigo Hamming para tener un mayor horizonte de lo que se esta haciendo. He variado un poco los pasos designados en el algoritmo, por beneficio propio, teniendo en total 5 pasos, incluida la comprobacion de un bit de error. Paso 1 : armamos el vector y colocamos la data en las posciones adecuadas, (posiciones 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, etc.) Paso 2 : armamos los minivectores para calcular los bits de paridad, aqui les muestro una imagen de como generalmente se tendrian que armar, cada minivector coge un numero determinado de datos del vector sin coger los bits de paridad. Posición 1: salta 1, comprueba 1, salta 1, comprueba 1, etc. Posición 2: comprueba 1, salta 2, comprueba 2, salta 2, comprueba 2, etc. Posición 4: comprueba 3, salta 4, comprueba 4, salta 4, comprueba 4, etc. Posición 8: comprueba 7, salta 8, comprueba 8, salta 8, comprueba 8, etc. Posición 16: comprueba 15, salta 16, comprueba 16, salta 16, comprueba 16, etc.
Paso 3 : simplemente enlazamos los bits de paridad con el vector de datos, y tendremos como resultado el Vector Hamming Paso 4 : comenzamos con la comprobación, ahora modificaremos un bit. Paso 5 : calculamos la posicion del bit erroneo, gracias a los bits de paridad analizaremos y los bits de paridad nos devolveran el numero de bit erroneo para su corrección. El código:Creo que todas las funciones aqui elaboradas, son entendibles, de igual forma, solo explicare razgos generales del codigo *Funcion necesaria para el paso 1.
'Funcion para convertir de binario a texto o texto a binario segun la opcion de direccion
'se recibe un vector de datos boleanos
Function BinTexTexBin(ByVal Vector() As Boolean, ByVal Texto As String, ByVal mk As Integer, ByVal Direccion As Boolean)
Dim i As Integer
'Si direccion = true, entonces se convertira de texto a binario, y se devolvera un vector
If Direccion = True Then
For i = 1 To Texto.Length
If Texto(i - 1).ToString = 1 Then
Vector(i) = True
Else
Vector(i) = False
End If
Next i
Return Vector
'Si direccion = false, entonces se convertira de binario a texto, y se devolvera un string
'siguiendo el formato Big Endian
Else
Texto = ""
For i = 1 To mk
If Vector(i) = True Then
Texto = Texto + "1"
Else
Texto = Texto + "0"
End If
Next i
Return Texto
End If
End Function
*Funcion necesaria para el paso 1.
'Funcion para armar posiciones de la data, en este caso la data debe ir en las posiciones
'que no son multiplos de 2^k, (posiciones 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, etc.)
Function ArmarPosiciones(ByVal Vector() As Boolean, ByVal m As Integer)
Dim VPosicion(2 * m + 1) As Boolean
Dim i, c, mk, Potencia As Integer
Dim Centinela As Boolean = False
i = 3
c = 1
Potencia = 2
While c <= m And Centinela = False
VPosicion(i) = Vector(c)
If c <> m Then
c = c + 1
i = i + 1
If i = Pow(2, Potencia) Then
Potencia = Potencia + 1
i = i + 1
End If
Else
Centinela = True
End If
End While
mk = i
Clipboard.SetText(mk.ToString)
Return VPosicion
End Function
*Funcion necesaria para el paso 2,4.
'Funcion para sacar los minivectores que son necesarios para el calculo de cada bit de paridad
'Posición 1: salta 1, comprueba 1, salta 1, comprueba 1, etc.
'Posición 2: comprueba 1, salta 2, comprueba 2, salta 2, comprueba 2, etc.
'Posición 4: comprueba 3, salta 4, comprueba 4, salta 4, comprueba 4, etc.
'Posición 8: comprueba 7, salta 8, comprueba 8, salta 8, comprueba 8, etc.
'Posición 16: comprueba 15, salta 16, comprueba 16, salta 16, comprueba 16, etc.
Function ArmarSecuenciaPar(ByVal Vector() As Boolean, ByVal Index As Integer, ByVal mk As Integer, ByVal m As Integer)
Dim VSecuencia(m) As Boolean
Dim Cantidad As Integer = Pow(2, Index)
Dim i, c, Terminos, Puntero As Integer
i = 1
For c = Cantidad To mk Step 2 * Cantidad
VSecuencia(i) = Vector(c)
Puntero = c
Terminos = 1
While Terminos < Cantidad
Terminos = Terminos + 1
i = i + 1
If (i <= m) And (Puntero + 1 <= mk) Then
VSecuencia(i) = Vector(Puntero + 1)
End If
Puntero = Puntero + 1
End While
i = i + 1
Next c
Return VSecuencia
End Function
*Funcion necesaria para el paso 2,4. gracias a la funcion xor.
'Funcion generadora de paridad entre 2 bits
Function GParidadPar(ByVal A As Boolean, ByVal B As Boolean) As Boolean
GParidadPar = A Xor B
Return GParidadPar
End Function
*Funcion necesaria para el paso 2,4.
'Funcion recursiva para determinar la paridad de los minivectores
'generados para cada bit de paridad
Function DetParidad(ByVal Vector() As Boolean, ByVal m As Integer) As Boolean
Dim i As Integer
If m <= 1 Then
DetParidad = Vector(m)
Return DetParidad
End If
DetParidad = GParidadPar(Vector(1), Vector(2))
If m <= 2 Then
Return DetParidad
End If
For i = 3 To m
DetParidad = GParidadPar(DetParidad, Vector(i))
Next i
Return DetParidad
End Function
*Funcion necesaria para el paso 3.
'Funcion que enlaza el vector de datos con el vector de paridades
'en sus posiciones designadas
Function ArmarSecuenciaYParidad(ByVal Vector() As Boolean, ByVal VParidad() As Boolean, ByVal m As Integer, ByVal k As Integer)
Dim VHamming(m + k) As Boolean
Dim i, c As Integer
i = 1
c = 1
While (i <= (m + k)) And (c <= k)
Vector(i) = VParidad(c)
i = Pow(2, c)
c = c + 1
End While
VHamming = Vector
Return VHamming
End Function
*Funcion necesaria para el paso 5.
'Funcion para convertir un binario a su representacion en numero entero
'siguiendo el formato Big Endian
Function BinarioANumero(ByVal Binario As String) As Integer
Dim Tamano, i, c As Integer
BinarioANumero = 0
Tamano = Binario.Length
c = Tamano
For i = Tamano To 1 Step -1
If Binario(i - 1).ToString = 1 Then
BinarioANumero = Pow(2, i - 1) + BinarioANumero
Else
BinarioANumero = BinarioANumero
End If
Next i
Return BinarioANumero
End Function
Creo que todo esta claramente explicado, como siempre, solo explico las funciones, el codigo interno del formulario lo envio en el archivo. uff, pos espero seguir aportando, me disculpo por perderme, pero es mi costumbre hacerlo xD, jaja, nos vemos hasta la proxima colaboración, chaitos!!! Espacios de nombres usados en el código de este artículo:Libreria utilizada System.Math Sobre el Autor:
|
Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:
El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.
En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.
Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:
Gracias.
| Código de ejemplo (comprimido): |
|
Fichero con el código de ejemplo: elMesero_Hamming.zip - 33.50 KB
|