[an error occurred while processing this directive]
|
это 16-битное дополнение до единицы суммы дополнений . При вычислении контрольной суммы это поле должно быть сперва обнулено. Если общая длина сообщения нечетная, то для вычисления контрольной суммы поле данных дополняется еще одним нулевым октетом.
This routine works is the number of data is even. if not the last data has to be turned into a 16 bit value.
In Pascal
Var i,Inter:Integer; //32 bits
Cksum:Word; //16 bits
begin
Inter:=0;
For i:=1 to 10 do Inter:=Inter+Data[i];
Cksum:=((Inter and $FFFF) + (Inter shr 16)) Xor $FFFF;
end;
in C :
u_short checksum(u_short * data,u_short length)
{
register long value;
u_short i;
for(i=0;i<(length>>1);i++) value+=data[i]; // add
if((length&1)==1) value+=(data[i]<<8); // compensate of odd amount of datas
value=(value&65535)+(value>>16); // complements one to one
return(~value); // XOR the result
}
in ASM PIC
;*******************************
calc_chsumm_IP
MOVF my_ip,W
MOVWF data_2+1
MOVF my_ip+1,W
MOVWF data_2
CALL calc_chsumm_1
MOVF my_ip+2,W
MOVWF data_2+1
MOVF my_ip+3,W
MOVWF data_2
CALL calc_chsumm_1
BTFSC FLAG_MAIN_REPLY
GOTO VALID_IP_CHS
MOVF source_ip,W
MOVWF data_2+1
MOVF source_ip+1,W
MOVWF data_2
CALL calc_chsumm_1
MOVF source_ip+2,W
MOVWF data_2+1
MOVF source_ip+3,W
MOVWF data_2
CALL calc_chsumm_1
RETURN
;*******************************
calc_chsumm_1
MOVF data_2+1,W
ADDWF chksum+1,F
BCF STATUS,Z
BTFSC STATUS,C
INCF chksum,F
BTFSC STATUS,Z
INCF chksum+1,F
MOVF data_2,W
ADDWF chksum,F
BCF STATUS,Z
BTFSC STATUS,C
INCF chksum+1,F
BTFSC STATUS,Z
INCF chksum,F
RETURN