USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
解决方案 »
- Textarea 赋值问题
- 求教怎么在image上绘制红色圆形???急急急急
- 这个问题有点难度。关于vb与EXCEL的,真心求助。
- 关于DataCombo控件问题~~~~~
- 绝望求助
- ????如何用字符串连接.DBF的数据库????
- 问几个初级的问题,大家别笑话我,0那位给解决了,单独发贴放100分,偶的分不多,见笑了,如果嫌少,勉强再加200也可以 :)决不食言而肥
- sql BETWEEN xx And yy 的用法!请教!
- vba子程序可以带参数吗?
- 一行代码...关于创建表的语句....用create...快来帮忙..快!!!!!!!!!@@@@刚才的问题没有解决完还有啊....
- ASP上传文件!急急急急…………!这段代码哪里有问题第一次上传好着!然后第第二次上传就出错了!
- 在字符串查找字符,有几种方法.
'typedef unsigned short int USHORT
private function checksum(buffer as any, size as long) as long
dim cksum as long
dim df as integer
cksum=0
df = size mod 2
do while (size > 1)
cksum = cksum + buffer(size \ 2 + df)
size = size - 2; ' sizeof(short int) = 2
loop
if (df = 1) then cksum = cksum + buffer(0)
cksum = (cksum \ (2^16)) + (cksum and &Hffff)
cksum = cksum + (cksum \ (2^16) )
checksum = (cksum and &Hffff)
end if
'这个函数在size为奇数时不一定能成功,想成功的话用读写内存的API吧,VB里可没有指针……
ByRef Destination As Any, _
ByRef Source As Any, _
ByVal Length As Long)Function UnsignedAdd(ByVal v1 As Long, ByVal v2 As Long) As Long
UnsignedAdd = (v1 Xor &H80000000) + v2 Xor &H80000000
End FunctionFunction Checksum(ByVal pBuffer As Long, ByVal size As Long) As Integer
Dim chsum As Long, a() As Integer, i As Long
If size = 0 Then Exit Function
ReDim a(((size + 1) \ 2) - 1)
CopyMemory a(0), ByVal pBuffer, size
For i = 0 To UBound(a)
chsum = UnsignedAdd(chsum, CLng(a(i)) And &HFFFF&)
Next
chsum = ((chsum \ &H10000) And &HFFFF&) + (chsum And &HFFFF&)
chsum = ((chsum \ &H10000) And &HFFFF&) + chsum
Checksum = chsum And &HFFFF
End Function