02. juli 2008 - 14:18Der er
10 kommentarer og 1 løsning
checksum algoritme
Hej
Jeg har en streng (char* str) indeholdende hex værdier (Det er en s19 record fra en .s19 fil, hvis det sku interessere nogle :-) ). Hver hexværdi udgøres af 2 cifre i strengen, dvs. str[0] og str[1] udgør altså det hexadecimale tal 21
De sidste 2 cifre i strengen er strengens checksum. checksummen beregnes i teorien på følgende måde (1 komplement checksum):
Alle hexværdierne lægges sammen. summen skal truncates med ( and 0x00FF ) for at sikre man kun har 2 cifre. Sidst findes komplementet (værdien inverteres)
Jeg har selv udarbejdet følgende kode, som ikke virker: Når imine summerede hexværdier bliver ANDED med 0x00FF får jeg resultatet 1, hvilket jeg antager er forkert :-) og min beregnede checksum bliver -2 hehe. Det er vigtigt at det er de hexadecimale værdier der lægges sammen. Som min kode er lægger jeg den decimale værdi sammen (base 10). Men jeg er ikke klar over hvordan jeg ellers kan håndtere hexværdier fra en streng. ________________________________________________________________________________________ //Her udhentes hexværdierne og hver værdi kopieres til en integer. kodeuddrag: { while( !(dataIndex >= endIndex) ) { checkSumStr[0] = srec[dataIndex]; checkSumStr[1] = srec[ (dataIndex + 1) ];
sscanf(checkSumStr, "%x", &temp); //Copy the hex value to an int printf("\nCheckSum integer type: %d", temp); printf("\nCheckSum from string: %s\n", checkSumStr);
bør lige tilføje at checksum resultatet på -2 jo er forkert, da man kan se på de 2 diste cifre i strengen (som ikke medregnes i algoritmen) at checksummen skal være 81.
&& betragter nemlig begge sider som boolske variable - dvs. den checker på om de to ting der står på hver side begge er forskellige fra FALSE (0) (i hvilket tilfælde den returnerer TRUE, eller 1). & derimod laver en AND på de individuelle bits - så hver bit i resultatet bliver sat til 1 hvis den same bit var sat til 1 i begge de to inputs. Når det ene input er en konstant, fungerer den som en bitmaske - dvs. den fjerner alle de bits fra det andet input der ikke er repræsenteret i din maske.
Lige for en god ordens skyld, så er det ikke sikkert det er det eneste der er galt med din algoritme - jeg lagde bare mærke til netop den del. :)
hehe, regnede det godt ud da jeg læste det anden gang :-). ER vist ved at være træt... Må hellere hente mere kaffe. er lige ved at teste med bitwise and. vender tilbage om lidt
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.