Registrarse

Como usuario registrado puedes acceder a la zona de descargas.

Top Panel

This panel contains four module positions: panel1, panel2, panel3 and panel4. If none of these have published modules, the panel will be hidden.

You have control over the panel settings. You can change panel's height (currently 250px), width (100%), background color and panel's button text (open/close).

Open

Calcular el Checksum de un fichero hexadecimal

 

Calcular el checksum de las líneas de un fichero hexadecimal.

 

A la hora de reprogramar mi FTL-7002, yo quería lograr que, mediante una hoja de cálculo, se pudiera sacar el fichero hexadecimal listo para grabar la memoria 24C04 y de esa forma simplificar la reprogramación a escribir las frecuencias de RX, TX y los Subtonos suponiendo que la emisora que usted esté reprogramando lleve la plaquita de subtonos.

Lograr pasar los datos de frecuencias a códigos hexadecimales, fue relativamente sencillo, simplemente viendo en qué frecuencia transmitía la emisora y analizando el código hexadecimal original, es relativamente sencillo extrapolar los datos para calcular los códigos correspondientes con la frecuencia que nos interese.

Sin embargo aún a pesar de reproducir “casi” exactamente el fichero hexadecimal, me continuaba dando problemas a la hora de grabarlo. Sucede que el programa ICPROG y según he podido ver otros muchos programas, utilizan un sistema de comprobación de integridad de datos basado en un “checksum”.

 

El “checksum” son dos dígitos hexadecimales, que se añaden al final de los datos, y que es una operación matemática de los datos de esa línea, de manera que cuando el programa carga los datos, realiza las operaciones matemáticas conducentes a obtener el cheksum y luego lo compara con el checksum que lleva el fichero, de tal forma, que si hay algún dato cambiado, ausente o corrompido, el checksum calculado por el programa, no va a coincidir con el que lleva el fichero hexadecimal en esa línea y por tanto el programa nosva a alertar sobre la posibilidad de que los datos sean incorrectos o estén corrompidos, y además nos va a decir en qué dirección de memoria está la fila errónea, con lo cual vamos a poder localizar el problema y analizar sus causas y posibles soluciones.

Si conseguimos calcular los checksums de cada línea, podremos añadirlos en nuestra hoja de cálculo, y de esa forma, crear un fichero hexadecimal listo para grabar. Unicamente tendremos que hacer alguna revisión visual, para añadir si falta algún dígito, normalmente serán ceros debido a que excel, cuando se le ponen 2 ceros, automáticamente lo toma como un único cero, pero esta eventualidad es muy sencilla de detectar y corregir, porque podemos ver el fichero de texto e identificar de manera visual y rápida las filas donde falta algún dígito, y corregirlo directamente en el fichero de texto.

Operar en hexadecimal no es muy corriente, y hacerlo a mano, aunque es posible, es farragoso e incómodo, y si no estamos acostumbrados, además la posibilidad de cometer errores es muy alta. ¿Porqué trabajar “a mano” si tenemos herramientas que lo hacen por nosotros?.

Qué necesitamos:

 

-Hoja de cálculo (la más habitual es Excel), pero Excel de Microsoft, no lleva las funciones para manejar hexadecimales instaladas de manera estándar. Si probamos las funciones hexadecimales y nos da error de “nombre?”, iremos a “Herramientas / Complementos” y pulsaremos sobre “Herramientas para análisis”, nos pedirá los discos de instalación, seguimos las indicaciones y en breve podemos disponer de estas herramientas.

-Los usuarios de Linux, la hoja de cálculo instalada por defecto (al menos en Ubuntu), OpenOffice Calc, las lleva incorporada por defecto, por tanto no tenemos que hacer nada, simplemente trabajar.

 

Las funciones hexadecimales que vamos a usar son dos:

 

=hex.a.dec(), esta función nos convierte uno o varios caracteres hexadecimales a números decimales.

=dec.a.hex(), esta función hace el trabajo inverso, es decir, convierte un número decimal a su equivalente hexadecimal

 

El resto de funciones que vamos a utilizar son comunes: la función extrae(), la funcion suma(), función residuo(), etc.

 

¿Cómo se calcula el checksum?

 

Es relativamente sencillo:

-Tomamos los dígitos hexadecimales según explico más abajo

-Los pasamos a decimal

-Los sumamos

-Calculamos el resto a 256

-Restamos el resto a 256

-Convertimos el número decimal que nos dá a hexadecimal, y ese es el checksum.

 

Explicarlo es más difícil que hacerlo, especialmente si nos apoyamos en una hoja de cálculo, con las funciones hexadecimales.

 

Ejemplo:

 

:10000000AAAA430043003F00FFFFFFFFFFFFFFFFDF

 

Esta es una fila hexadecimal correspondiente a la fila 1 del fichero de programación de la FTL-7002

 

Esta línea tiene 3 partes claramente diferenciadas:

 

:10000000, que es la identificación de la línea.

 

AAAA430043003F00FFFFFFFFFFFFFFFF, que son los datos propiamente dichos.

 

DF, que es el checksum (lo que calcularemos a partir de los datos anteriores).

 

DESMENUZANDO LA FILA:

 

: (inicio de línea, irrelevante)

10 es la cantidad de datos, (en hexadecimal), por tanto corresponde con el número 16 en decimal, es decir, en la fila hay 16 datos (que van agrupados de 2 en 2, es decir hay un total de 32 dígitos de información en 16 bloques de 2 dígitos).

 

0000 es la posición de memoria donde se aloja el primer dato (en hexadecimal), y corresponde con el número de fila hexadecimal, en este caso es la fila 0000, que es la fila 0 en decimal

 

00 son los dos últimos dígitos, y son función del tipo de memoria que utiliza (datos 00, memoria extendida 02, fin de fichero 01)

 

A continuación vienen los datos, agrupados de 2 en 2:

 

AA

AA

43

00

 

ETC.

 

Finalmente el dígito de control: DF

 

Vamos a calcular el dígito de control partiendo de la información anterior.

 

-Los pasamos a decimal, mediante la función =hex.a.dec()

-Los sumamos, mediante la función =suma()

-Calculamos el resto a 256, mediante la función =residuo(), usando como argumento el 256

-Restamos el resto a 256, simplemente restamos.

-Convertimos el número decimal que nos dá a hexadecimal mediante la función =dec.a.hex() , y ese es el checksum.

 

NOTA: si el checksum en decimal da 256, al pasarlo a hexadecimal dará 100, en ese caso hay que eliminar el 1 y el checksum quedará convertido a 00.

 

Veamos los datos.

 

 

:1000000AAAA430043003F00FFFFFFFFFFFFFFFFDF

 

     
 

Hexadecimal

Decimal

 

Datos

10

16

 

Dirección

0000

0

 

Tipo datos

00

0

 

1

AA

170

 

2

AA

170

 

3

43

67

 

4

00

0

 

5

43

67

 

6

00

0

 

7

3F

63

 

8

00

0

 

9

FF

255

 

10

FF

255

 

11

FF

255

 

12

FF

255

 

13

FF

255

 

14

FF

255

 

15

FF

255

 

16

FF

255

 

Checksum

DF

   
       
 

Suma de datos

2593

 
 

Residuo

33

 
 

Resta Residuo

223

 
 

Checksum

DF

 

 

 

 

 

Veamos las fórmulas: (la fila de datos está en la celda A1)

 

 

:1000000AAAA430043003F00FFFFFFFFFFFFFFFFDF

 

   
 

Hexadecimal

Decimal

Datos

=EXTRAE($A$1;2;2)

=HEX.A.DEC(B4)

Dirección

=EXTRAE($A$1;3;4)

=HEX.A.DEC(B5)

Tipo datos

=EXTRAE($A$1;7;2)

=HEX.A.DEC(B6)

1

=EXTRAE($A$1;9;2)

=HEX.A.DEC(B7)

2

=EXTRAE($A$1;11;2)

=HEX.A.DEC(B8)

3

=EXTRAE($A$1;13;2)

=HEX.A.DEC(B9)

4

=EXTRAE($A$1;15;2)

=HEX.A.DEC(B10)

5

=EXTRAE($A$1;17;2)

=HEX.A.DEC(B11)

6

=EXTRAE($A$1;19;2)

=HEX.A.DEC(B12)

7

=EXTRAE($A$1;21;2)

=HEX.A.DEC(B13)

8

=EXTRAE($A$1;23;2)

=HEX.A.DEC(B14)

9

=EXTRAE($A$1;25;2)

=HEX.A.DEC(B15)

10

=EXTRAE($A$1;27;2)

=HEX.A.DEC(B16)

11

=EXTRAE($A$1;29;2)

=HEX.A.DEC(B17)

12

=EXTRAE($A$1;31;2)

=HEX.A.DEC(B18)

13

=EXTRAE($A$1;33;2)

=HEX.A.DEC(B19)

14

=EXTRAE($A$1;35;2)

=HEX.A.DEC(B20)

15

=EXTRAE($A$1;37;2)

=HEX.A.DEC(B21)

16

=EXTRAE($A$1;39;2)

=HEX.A.DEC(B22)

Checksum

=EXTRAE($A$1;41;2)

 
     
 

Suma de datos

=SUMA(C4:C22)

 

Residuo

=RESIDUO(C25;256)

 

Resta Residuo

=256-C26

 

Checksum

=DEC.A.HEX(C27)

 

 

 

Como he comentado anteriormente, es más fácil de hacer con excel que de explicarlo.

 

Descarga el fichero de ejemplo (formato MS Excel)

 

Atentamente,

 

EA5BFT

“Pedrolo”

 

EAQRP MEMBER

 

Cross-Browser Compatible

This template uses modern CSS3 functions supported by modern browsers. It uses script that maintain IE7 and IE8 compatibility.

Tested in IE7+, Firefox, Opera, Chrome, Safari and Camino.

Webs Amigas