[C con Clase] checksum

Steven R. Davidson vze266ft en verizon.net
Jue Mar 13 06:42:02 CET 2008


Hola Sebastián,

Sebastian Oldani wrote:
> Hola, sigo peliando con los puertos, gracias a todos por responder, ya 
> voy a ver si lo logro hacer funcionar. Sin embargo ahora tengo una duda 
> muy importante, necesito calcular un checksum y no entiendo bien como 
> hacerlo. en el manual dice cito textual:
> 
> CHECKSUM
> This value is calculated by summing the value of the first byte 
> (Packet[0]) to the value of 573th byte (Packet[573]) and ‘mod’ by 
> 256*256. This is to confirm the full packet be received correctly.
> 
> Tengo que comprobarlo si o si asi al checksum, porque asi me lo da el 
> dispositivo que tengo conectado a mi PC. El checksum es de 2 Byte. No 
> entiendo bien como lo debo calcular. si alguien entiende que significa 
> ese "mod" y como puedo obtener de eso 2 bytes. Gracias igual
> Nos vemos.
> 

"mod" hace alusión a la operación del módulo de una división; es decir, 
el resto de una división. En C/C++, el operador % realiza esta operación.

Me temo que el texto no está bien escrito. Descubrí la página que 
contiene el PDF con la documentación de la cual sacaste este párrafo. El 
enlace es: 
ftp://www.ewt.com.tw/NewDownLoad/Chinese/Fingerprint%20Programmer%20Guide%20(WM-1xx).pdf

Leyendo parte de la documentación, lo que intentan decir es que se suman 
todos los valores desde el paquete 0 hasta el 574º como máximo. Esta 
cantidad luego es operada por el módulo con 65536. Esto sería algo así:

unsigned long nSuma = suma( paquete, N );
unsigned short nChecksum = nSuma % 65536;


Esto implica que obtendremos un valor entre 0 y 65535 (ambos incluidos) 
como el resultado del "mod". Básicamente esto significa aceptar los 
últimos 16 bits y descartar los demás. Por lo tanto, podríamos usar un 
cásting a 'short int' y así obtener los últimos 16 bits. Por ejemplo,

unsigned long nSuma = suma( paquete, N );
unsigned short nChecksum = (unsigned short)nSuma;

También podrías crear una máscara OR para "filtrar" los 16 bits que te 
interesan. Por ejemplo,

const unsigned long nMascara = 0x0000FFFF;
unsigned long nSuma = suma( paquete, N );
unsigned short nChecksum = nSuma | nMascara;


Espero que esto te ayude.

Steven






Más información sobre la lista de distribución Cconclase