function CheckSum(var Buffer; Size:Integer):Word;
type
TWordArray = array[0..1] of Word;
var
ChkSum : Longword;
i : Integer;
begin
ChkSum := 0; i := 0;
while Size>1 do begin
Inc(ChkSum,TWordArray(Buffer)[i]);// 疑问1. 强制类型转换 Buffer , 但是 i的值 超过了3 怎么回事啊 ?
Inc(i);
Dec(Size,SizeOf(Word));
end; if Size=1 then
Inc(ChkSum,Byte(TWordArray(Buffer)[i])); ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF);//疑问1 这是做什么用的 ?
Inc(ChkSum,(Chksum shr 16));
Result := Word(not ChkSum);
end;
另外 谁可以 推荐下 CheckSum 算法的原理的文章 ,我找了半天没找到比较好的。
谢谢
type
TWordArray = array[0..1] of Word;
var
ChkSum : Longword;
i : Integer;
begin
ChkSum := 0; i := 0;
while Size>1 do begin
Inc(ChkSum,TWordArray(Buffer)[i]);// 疑问1. 强制类型转换 Buffer , 但是 i的值 超过了3 怎么回事啊 ?
Inc(i);
Dec(Size,SizeOf(Word));
end; if Size=1 then
Inc(ChkSum,Byte(TWordArray(Buffer)[i])); ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF);//疑问1 这是做什么用的 ?
Inc(ChkSum,(Chksum shr 16));
Result := Word(not ChkSum);
end;
另外 谁可以 推荐下 CheckSum 算法的原理的文章 ,我找了半天没找到比较好的。
谢谢
解决方案 »
- 有关IdHTTP1.Post
- Delphi调用VC版COM接口函数抛异常
- 在图片上放一个Label实现超链接的效果,出现的问题?请高手指点
- 发布一个用于 UBB代码转HTML的 程序
- 如何判定数据库正在被修改?
- 在线等待。。急。。200分。。。@#¥¥%^&×&(请问怎么统计listview所显示的内容
- IdSmtp 用 smtp.netease.com 发送邮件的问题
- udp控件问题!
- 《菜鸟问题》新安装INTERBASE的用户名和密码是什么???
- 用delphi 5.0 在A客户端写得程序,运行良好。把它拷贝到B上运行,就出现错误。 高手
- Delphi中使用API ReadFile 的一个问题
- c/s系统如何升级支持Internet访问呢
检验和,校验和(checksum)。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验的过程中看作数字的其它字符串。
编辑本段表示
它通常是以十六进制为数制表示的形式,如: 十六进制串: 0102030405060708 的效验和是: 24 (十六进制) 如果效验和的数值超过十六进制的FF,也就是255. 就要求其补码作为效验和. 通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性.
1、IP首部校验
IP首部校验和字段是根据IP首部计算的校验和码,它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据校验和码。
2、IP首部校验和计算
为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
3、TCP和UDP校验和计算(两者相同)
校验和还包含—个96位的伪首标,理论上它位于TCP首标的前面。这个伪首标包含了源地址、目的地址、协议和TCP长度等字段,这使得TCP能够防止出现路由选择错误的数据段。这些信息由网际协议(IP)承载,通过TCP/网络接口,在IP上运行的TCP调用参数或者结果中传递。 伪首部并非UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。 这样的校验和,既校验了UDP用户数据的源端口号和目的端口号以及UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。(伪报头保证UDP和TCP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。)
4、文件效验和
在windows中,exe校验和是没有必要的。然是sys文件和关键的dll文件是被要求要校验和的。