Delphi基础不够扎实,上来求大神解答,以下代码的意思:var
sPayPower:Double;
aMoney: Int64;
sPayTimes:Integer;
arrMoney4: array [0..3] of byte;
aTimes, CS1, CS2: byte;
begin
aMoney := trunc(Abs(sPayPower));
aMoney := aMoney * 1000;
aTimes := CalPayTimes(sPayTimes); fillchar(arrMoney4, sizeof(arrMoney4), 0);
move(aMoney, arrMoney4, sizeof(aMoney)); CS1 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + Ord('X')) mod 256);
CS2 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + aTimes) mod 256); CS1 := (CS1 shl 4) + (CS1 shr 4);
CS2 := (CS2 shl 4) + (CS2 shr 4); arrMoney4[0] := (arrMoney4[0] shl 4) + (arrMoney4[0] shr 4);
arrMoney4[1] := (arrMoney4[1] shl 4) + (arrMoney4[1] shr 4);
arrMoney4[2] := (arrMoney4[2] shl 4) + (arrMoney4[2] shr 4);
arrMoney4[3] := (arrMoney4[3] shl 4) + (arrMoney4[3] shr 4);
end;
DelphisizeofMove shr shl
sPayPower:Double;
aMoney: Int64;
sPayTimes:Integer;
arrMoney4: array [0..3] of byte;
aTimes, CS1, CS2: byte;
begin
aMoney := trunc(Abs(sPayPower));
aMoney := aMoney * 1000;
aTimes := CalPayTimes(sPayTimes); fillchar(arrMoney4, sizeof(arrMoney4), 0);
move(aMoney, arrMoney4, sizeof(aMoney)); CS1 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + Ord('X')) mod 256);
CS2 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + aTimes) mod 256); CS1 := (CS1 shl 4) + (CS1 shr 4);
CS2 := (CS2 shl 4) + (CS2 shr 4); arrMoney4[0] := (arrMoney4[0] shl 4) + (arrMoney4[0] shr 4);
arrMoney4[1] := (arrMoney4[1] shl 4) + (arrMoney4[1] shr 4);
arrMoney4[2] := (arrMoney4[2] shl 4) + (arrMoney4[2] shr 4);
arrMoney4[3] := (arrMoney4[3] shl 4) + (arrMoney4[3] shr 4);
end;
DelphisizeofMove shr shl
解决方案 »
- Delphi2007+Dev开发中的一个奇怪问题,请使用过的朋友帮帮忙!
- 请教 dlltools.pas 的问题 使用后无法正常编译
- 招DELPHI软件工程师
- 我从数据库中提取出两个数,如何将两个字符型的变为数字型的然后相加得出个结果,30分
- XML问题:怎么发送XML命令和读取XML文档,100分
- Web Broker开发的ISAPI的DLL调试通过,发布后访问ADO时出错,请高手指点.
- 祸不单行昨日行,福无双至今日至
- 高分求一数据库管理实例
- 用delphi实现一个抽奖程序(急,解决立即给分,可以开贴加分)
- 条码打印问题!请有经验的朋友进来聊聊!
- 用dbchart怎样画一条竖直的虚线?
- 200 分!! winsock , listen 数量问题
var
sPayPower:Double;
aMoney: Int64;
sPayTimes:Integer;
arrMoney4: array [0..3] of byte;
aTimes, CS1, CS2: byte;
begin
aMoney := trunc(Abs(sPayPower)); //Abs: 取绝对值, trunc取整
aMoney := aMoney * 1000;
aTimes := CalPayTimes(sPayTimes); //CalPayTimes用户自定义函数 fillchar(arrMoney4, sizeof(arrMoney4), 0);为arrMoney4赋初值, 全部为0
move(aMoney, arrMoney4, sizeof(aMoney)); //将aMoney的值放入arrMoney4 CS1 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + Ord('X')) mod 256);//将arrMoney4数组各元素值相加后用256取模
CS2 := byte((arrMoney4[0] + arrMoney4[1] + arrMoney4[2] + arrMoney4[3] + aTimes) mod 256);//同上 CS1 := (CS1 shl 4) + (CS1 shr 4);//CS1 := cs1的2进制值左移4位 + cs1的2进制值右移4位
CS2 := (CS2 shl 4) + (CS2 shr 4);//理同上
//下边4个, 理同上
arrMoney4[0] := (arrMoney4[0] shl 4) + (arrMoney4[0] shr 4);
arrMoney4[1] := (arrMoney4[1] shl 4) + (arrMoney4[1] shr 4);
arrMoney4[2] := (arrMoney4[2] shl 4) + (arrMoney4[2] shr 4);
arrMoney4[3] := (arrMoney4[3] shl 4) + (arrMoney4[3] shr 4);
end;
Move 内存移动var
cs1 : byte;
begin
cs1 := 250;//对应二进制1111 1010
cs1 := (cs1 shl 4) + (cs1 shr 4); // 1010 0000 + 0000 1111 = 1010 1111 = 175
end;
只是操作符不使用特殊字符,而是改用单词
shr >>
shl <<
xor ^
not !还是~
mod %move其实是内存块复制
我主要是下面这句不明白:
move(aMoney, arrMoney4, sizeof(aMoney)); //将aMoney的值放入arrMoney4将一个整型拷贝到byte数组中,值是怎么转换的呢?
比如aMoney:=123000 的话。
move(aMoney, arrMoney4, sizeof(aMoney));
showmessage(inttostr(arrmoney4[0]));在第三条语句下断点,程序跑起来,鼠标移动到arrMoney4上就可以看见数组的值:(120,224,1,0),即($78, $E0, $1, $0).
123000等于16进制的$0001E078。由于是Int64,内存中低4个字节是$0001E078,高4个字节是0.
第2条move语句将aMoney的8个字节的内容拷贝到arrMoney4.而arrMoney4才4个字节,它得到aMoney的低4个字节的内容0001E078,高4个字节的内容覆盖到了arrMoney4的地址+4的位置sPayTimes。这溢出了,正确move的第3个参数应当是sizeof(arrMoney4)。