首页 文章

什么是Delphi相当于C的memset?

提问于
浏览
3

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;

1 回答

  • 8

    等效于 memset 的是FillChar,并使用字节值填充一系列字节 .

    由于 sz 的字节顺序反转时,数组 sz 中的所有字节都被置位,因此可以删除该行 .

    字节反转可以简化一点(用类型限制替换 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];
    

相关问题