[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