C 函数如下:
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);
}
问如何转换成 Delphi 代码谢谢了!。小弟 不知道 C 的 >> 还有 ~ 等同于 Delphi 的什么。
有人告诉我 C 的 ~ 等同于 Delphi Not 可是好像不对。
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);
}
问如何转换成 Delphi 代码谢谢了!。小弟 不知道 C 的 >> 还有 ~ 等同于 Delphi 的什么。
有人告诉我 C 的 ~ 等同于 Delphi Not 可是好像不对。
C++ Delphi
>> shr
<< shl
~ not
cksum >>16:cksum shr 16~ 是按位取反 如~00000000=11111111
想当于 Delphi 的什么啊!
这个想当于 delphi 什么啊! 是 Byte 吗?
想当于 Delphi 的什么啊!
----------------------------------
相当于word.
function checksum(buffer:PWORD;size:integer):WORD;
var
cksum:longword;
begin cksum:=0;
cksum:=buffer^; while size>1 do
begin cksum:=buffer^;
Inc(buffer);
//------------------
size:=size-sizeof(SHORT);
end;
if size<>0 then
begin
cksum:=cksum+ Byte(buffer^);
end; cksum := (cksum shr 16) + (cksum and $FFFF);
checksum:= WORD(not cksum);
end;
function checksum(buffer:PWORD;size:integer):WORD;
var
cksum:longword;
begin cksum:=0; while size>1 do
begin cksum:=buffer^;
Inc(buffer);
//------------------
size:=size-sizeof(SHORT);
end;
if size<>0 then
begin
cksum:=cksum+ PByte(buffer)^;
end; cksum := (cksum shr 16) + (cksum and $FFFF);
cksum := cksum+(cksum shr 16);
checksum:= WORD(not cksum);
end;
var
cksum: Longword;
begin
cksum := 0;
while (size >1) do
begin
cksum := cksum + buffer^;
inc(buffer);
size := size - sizeof(word);
end;
if(size > 0) then
begin
cksum := cksum + word(buffer^);
end cksum := (cksum shl 16) + (cksum and 0xffff);
cksum := cksum + (cksum shl 16);
result := word(not cksum);
end;
//c 代码最后返回 65208
//--------------------------------------------------------------------
#include <stdio.h>
typedef unsigned short USHORT;
typedef unsigned char UCHAR;
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);
}void main()
{
USHORT a=123;
printf("%d\n",checksum(&a,3));
//打印结果65208}
//--------------------------------------------------------------------
//Delphi 代码返回 返回 65421
function checksum(buffer:PWORD;size:integer):WORD;
var
cksum:longword;
begin
cksum:=0;
while size>1 do
begin
//这里和C的结果不同.
cksum:=cksum+buffer^;
Inc(buffer);
//------------------
size:=size-sizeof(WORD);
end;
if not size=0 then
begin
cksum:=cksum+ PByte(buffer)^;
end;
cksum := (cksum shr 16) + (cksum and $FFFF);
cksum := cksum+(cksum shr 16);
checksum:= WORD(not cksum);
end;procedure TForm1.Button1Click(Sender: TObject);
var
aa:WORD;
begin
aa:=123;
showmessage(Format('%d',[checksum(@aa,3)]));
//返回 65421
end;
Inc(buffer);
是否等同于.
cksum+=*buffer++;
还有就是我用的是 VC2003 下面代码 USHORT p=&a;
*p++;
printf("%d\n",*p);
p++;
printf("%d\n",*p);
p++;
printf("%d\n",*p);
打印的结果都是一样的好像不对吧
修改為:
buffer := buffer + sizeof(WORD);
試試如何??
老兄再次感谢您的恢复:
可是你的代码编译不过啊!指针可以这么用吗?
[Error] Unit1.pas(34): Operator not applicable to this operand type
USHORT a[]={123,111,222,333};
printf("%d\n",checksum(a,3)); //65301delphi的代码修改如下:
var
aa:array[0..3] of WORD;
begin
aa[0]:=123;
aa[1] := 111;
aa[2] := 222;
aa[3] := 333;
showmessage(Format('%d',[checksum(@aa,3)])); //65301
end;另外, if not size=0 then这句,因为not的优先级高,所以没有进入函数体,应修改为if not(size=0) then
Inc(buffer, sizeof(WORD));
需要请联系[email protected]
>>[Error] Unit1.pas(34): Operator not applicable to this operand type
buffer := pword(integer(buffer) + sizeof(WORD));應該還是用 Inc(buffer) 啊, 要不然, 邏輯上不對, 我感覺!!!