# Problema con Checksum en protocolo de un lector de huella digital



## freko (Mar 25, 2009)

Que tal amigos, estoy programando en C para Linux una interface con un lector de huella digital, el distribuidor me paso la hoja de datos del protocolo a bajo nivel, pero no se si mi nivel de ingles no me da para tanto que no he podido entender como realiza el checksum, este es el texto en el que explica muy breve como hacer el checksum:

"Verification and (CheckSum) algorithm: According to unsign short integer accumulate the entire packet, till over 2147483648 (long 4 bytes), gains the low 2 byte values continue to add together again, depending on the position that the value is obtained to get ones complement, and transformadorrm it into the short integer (unsigned short 2 bytes), namely obtains the verification sum."

Este es un ejemplo de un paquete de datos:
01 01 81 7E 08 00 75 80 E8 03 17 FC 00 00 00 00
Los bytes en rojo es el checksum, este es un ejemplo de paquete que copie de una comunicacion entre el lector de huella digital y un programa para windows que me dio el distribuidor, he intentado realizar la suma y hacer el complemento a uno pero no ha coincidido, espero que alguien que tenga experiencia en checksums me pueda ayudar gracias.


----------



## TITUS (Abr 16, 2009)

Prueba con realizar la operacion Xor (Or Exclusiva)... entre los pares y otra Xor entre los impares....  lo he hecho con la trama que pones como ejemplo pero pareceria que te falta un dato en los impares ... el 2

01 01 81 7E 08 00 75 80 E8 03 17 FC

01  xor  81 xor 08 xor 75 xor E8 xor (2) ?  ====> 17  Los impares (el 2 faltaria...)

     01 xor 7E xor 00 xor 80 xor 03             ====> FC       los pares


----------



## freko (Abr 16, 2009)

Gracias por contestar, de hecho ya pude resolver el checksum, el problema es que estaba sumando byte a byte y despues realizando el complemento a uno, osea que supuse que seria una suma de 8bits, pero resulta que la suma debe de ser de 16bits, osea que voy sumando pares, en el ejemplo que di seria asi:

0101 + 817E + 0800 + 7580 + E803 + 0000 + 0000 + 0000                  

Los 2 bytes en donde deberia ir 17FC el checksum se reemplazan con ceros, el resultado de la suma es 1E802 este se convierte en un numero de 2 bytes de la siguiente manera, dejando los 2 bytes menos significativos y sumandole los 2 bytes mas significativos, en este caso es facil la suma ya en 2 bytes seria E803, a esto le aplicas complemento a uno y obtienes 17FC, este tipo de checksum lo pude realizar ya que es muy similar al checksum de los paquetes TCP, gracias por la ayuda.


----------



## mchurichi (Feb 6, 2010)

Hola freko, t hago una consulta si no te molesta... estoy haciendo un driver para un ZK X628 y el manual que consegui (http://www.zk-usa.com/upload/Communication protocol manual_CMD.pdf) no parece coincidir con el protocolo de este modelo... sobre que sensor estas trabajando?

Gracias.


----------

