int hex2num( char c )
nazov hovori za vsetko - prevedie vstupny parameter znak na ciselny typ ( cize napr z '5' spravi 5 v int ). c - '0' preto, lebo ak je znak c 0, '0' - '0' je nula, cize int bude 0. '1' - '0' je rozdiel 1, cize vysledok je 1, atd ...
const char *in=":10010000214601360121470136007EFE09D21901XX";
retazec uchovavajuci hexadecimalne cisla, bajt po bajte, cize:
10 01 00 00 ... D2 19 01
hex2num( in[1] ) << 4 )
druhy prvok pola in ( prvy je in[0] a je rovny znaku ":" ) prevedie na cislo a vynasobi ho 2^4 ( lepsie povedane, bitovo posunie toto cislo o 4 bity dolava - nasobenie sa iba lahsie predstavuje ). Je to preto, lebo na prevod z hexa do dec sa druha cifra zprava v hexa cisle vynasobi sestnastkou a pripocita sa prva cifra zprava.
| hex2num( in[2] ) )
tu je to pripocitanie prvej cifry ( bitovy sucet ).
+ 4
k vysledku sa pripocita cislo 4 -- netusim z akeho dovodu ( vysledok cnt je 20 )
for( k = 0; k < cnt; ++k )
cyklus sa vykona cnt, teda 20-krat. Ak si pozries, kolko hex cisel velkosti 1 bajt sa nachadza v retazci in, uvidis, ze ich je presne 20
sum += ( hex2num( in[( k << 1 ) + 1] ) << 4) | hex2num( in[( k << 1 ) + 2] );
proces sa opakuje s tym, ze sa prejde vsetkych 20 ( v tomto pripade ) "bajtov"
Vysledok je sucet tychto bajtov v premennej sum ulozenych desiatkovo.
sum & 0xff
orezanie na spodny jeden bajt ( rozsah 0 - 255 )
printf( "%02X\n", ( ( 0xff - ( sum & 0xff ) ) + 1 ) & 0xff );
vypisanie vysledneho, este nejako orezneho cisla, v hexadecimalnom tvare
|