sz是一个char数组,也就是缓冲区中指向的memset是什么?如何将以下C ++代码转换为Delphi?
int data = _ttoi(m_Strtag.GetBuffer(0));
unsigned char sz[4];
memset(sz,0, 4);
sz[0] = (unsigned char)((data >> 24) & 0xFF);
sz[1] = (unsigned char)((data >> 16) & 0xFF);
sz[2] = (unsigned char)((data >> 8) & 0xFF);
sz[3] = (unsigned char)(data & 0xFF);
这是delphi调用: 如果SAAT_YTagSelect(hp,isenable,1,sz,4)那么......
以下delphi函数:
function SAAT_YTagSelect(pHandle: Pointer; nOpEnable1, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall;
答案 0 :(得分:8)
等效于memset
的是FillChar,并使用字节值填充一系列字节。
由于当sz
的字节顺序颠倒时,数组data
中的所有字节都被设置,因此可以删除此行。
字节反转可以简化一点(用类型限制替换and $FF
):
data := StrToInt(aString);
sz[0] := Byte(data shr 24);
sz[1] := Byte(data shr 16);
sz[2] := Byte(data shr 8);
sz[3] := Byte(data);
通过用Byte()
括起赋值,编译器被告知跳过范围检查。
对生成的汇编代码(带范围检查)的比较表明,这也产生了更有效的代码:
Project1.dpr.36: sz[0] := Byte(data shr 24);
0041C485 A1BC3E4200 mov eax,[$00423ebc]
0041C48A C1E818 shr eax,$18
0041C48D A2C03E4200 mov [$00423ec0],al
Project1.dpr.40: sz[0] := (data shr 24) and $FF;
0041C485 A1BC3E4200 mov eax,[$00423ebc]
0041C48A C1E818 shr eax,$18
0041C48D 25FF000000 and eax,$000000ff
0041C492 3DFF000000 cmp eax,$000000ff
0041C497 7605 jbe $0041c49e
0041C499 E8F290FEFF call @BoundErr
0041C49E A2C03E4200 mov [$00423ec0],al
一种更直接的填充sz数组的方法,没有比特转换程序:
sz[0] := PByte(@data)[3];
sz[1] := PByte(@data)[2];
sz[2] := PByte(@data)[1];
sz[3] := PByte(@data)[0];