📄 cksum.c
字号:
/*
;-------------------------------------------------------------------------
; Copyright (c) 2002 Jim Brady
; Do not use commercially without author's permission
; Last revised August 2002
; CKSUM.A51
;
; This computes the internet checksum on an 8051
;
; Call from C program: uint cksum(UCHAR * buf, uint length);
; Where * buf is pointer to first char (must be in space)
; and "length" is number of bytes (not words) to sum over
;-------------------------------------------------------------------------
*/
#include "net.h"
#include "utils.h"
uint cksum(UCHAR *check,uint length) //计算校验和
{
long sum=0;
uint i;
uint *ptr;
uint t;
ptr=(uint *)check;
for (i=0;i<(length)/2;i++)
{
t = *ptr++;
#ifdef __LITTLEENDIAN__
t = ntohs((char*)&t, 0);
#endif
sum += t;
}
if (length&0x01)//表示长度为单数
{
t = (*ptr);
#ifdef __LITTLEENDIAN__
// t = ReadUInt16((char*)&t, 0);
t = t<<8;
#endif
sum = sum+(t&0xff00);
// sum += t;
}
sum=(sum&0xffff)+((sum>>16)&0xffff);//高16位和低16位相加
if(sum&0xffff0000)
{//表示有进位
sum++;
}
return ( (uint)((sum)&0xffff));
// return ( (uint)(~((sum)&0xffff)));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -