DWORD CAXPFile::HashString(const char *lpszFileName, DWORD dwCryptIndex)
{ signed char *key = (signed char *)lpszFileName;
DWORD seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;
signed int ch;

while(*key != 0)

ch = *key++;
seed1 = m_CryptTable[(dwCryptIndex<< 8) + ch] ^ (seed1 + seed2);
seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3; 
}

return seed1; }BOOL CAXPFile::GetHashTablePos(const char *lpszString, int *lpFileOffset, int *lpFileSize)
{
const int HASH_A = 1, HASH_B = 2, HASH_OFFSET = 3;  

int nHashA = HashString(lpszString, HASH_A);
int nHashB = HashString(lpszString, HASH_B);

int nHash = HashString(lpszString, HASH_OFFSET);

nHash &= 0x7FFF;
int nHashStart = nHash, nHashPos; try
{
while (!((nHashPos = ((int*)m_lpAxpHashTable)[nHashStart * 3 + 2]) & 0x80000000) ||\
nHashA != ((int*)m_lpAxpHashTable)[nHashStart * 3] ||\
nHashB != ((int*)m_lpAxpHashTable)[nHashStart * 3 + 1])
{
nHashStart++;
nHashStart &= 0x7FFF;
if (nHashStart == nHash)
{
return FALSE;
}
}
}
catch (...)
{
return FALSE;
} nHashPos &= 0x3FFFFFFF;
*lpFileOffset = ((int*)m_lpAxpFileInfo)[nHashPos * 3];
*lpFileSize = ((int*)m_lpAxpFileInfo)[nHashPos * 3 + 1];

return TRUE;  
}哪位大虾帮忙转为D

解决方案 »

  1.   

    第一个函数:Cardinal HashString(FileName:PChar,Cardinal CryptIndex);
    var
      Seed1,Seed2:Cardinal;
      ch:Integer;  
      Key:Integer;//变量Key用来遍历字符串中的每一个字符
    begin
      Key=0;//取第一个字符
      seed1:=$7FED7FED;
      seed2:=$EEEEEEEE;
      while(FileName[key]!=#0) do
      begin
        ch=FileName[key];
        Inc(Key);
        seed1:=Power(m_CryptTable[(CryptIndex shl 8)+ch],(seed1+seed2));
        seed2:=ch+seed1+seed2+(seed2 shl 5)+3; 
      end; 
      Result:=seed1;
    end;
      

  2.   

    函数定义写错了,应该是
    Function HashString(FileName:PChar,Cardinal CryptIndex):Cardinal;
      

  3.   

    while(FileName[key]!=#0) do  这句是不是要改改  delphi没!=这种用法吧
      

  4.   

    再次纠正第一段的函数定义错误:Function HashString(FileName:PChar;CryptIndex:Cardinal):Cardinal;
    第二段function GetHashTablePos(Str:PChar;var FileOffset:Integer;var FileSize:Integer):Boolean;
    var
      HASH_A,HASH_B,HASH_OFFSET:Integer;
      nHashA,nHashB,nHash:Integer;
      nHashStart,nHashPos:Integer;
    begin
      HASH_A:= 1;
      HASH_B:= 2;
      HASH_OFFSET:= 3;  nHashA:=HashString(Str,HASH_A);
      nHashB:=HashString(Str,HASH_B);    
      nHash:=HashString(Str,HASH_OFFSET);
        
      nHash:=nHash and $7FFF;
      nHashStart:=nHash;
      try
        nHashPos:=m_lpAxpHashTable[nHashStart*3+2];
        while ( (Not (nHashPos and $80000000) ) or
                nHashA<>m_lpAxpHashTable[nHashStart*3] or
                nHashB<>m_lpAxpHashTable[nHashStart*3+1]
              ) do
        begin
          Inc(nHashStart);
          nHashStart:=nHashStart and $7FFF;
          if (nHashStart=nHash) then
          begin
            Result:=FALSE;
          end;
          nHashPos:=m_lpAxpHashTable[nHashStart*3+2];
        end;
      except
      begin
        Result:=False;
      end;  nHashPos:=nHashPos and $3FFFFFFF;
      FileOffset:=m_lpAxpFileInfo[nHashPos*3];
      FileSize:=m_lpAxpFileInfo[nHashPos*3+1];
        
      Result:=TRUE;  
    end;
    注:以上翻译可能存在语法错误,请检查,但我认为大体思路是正确的。
      

  5.   

    的确应该改改,可以这样
    while(FileName[key]<>#0) do 
      

  6.   

    Cardinal HashString(FileName:PChar,Cardinal CryptIndex);
    var
      Seed1,Seed2:Cardinal;
      ch:Integer;  
      Key:Integer;//变量Key用来遍历字符串中的每一个字符
    begin
      Key:=0;//取第一个字符,这里也少了个冒号
      seed1:=$7FED7FED;
      seed2:=$EEEEEEEE;
      while(FileName[key]<>#0) do //不等于没有翻译为Delphi的
      begin
        ch:=FileName[key];//少了个冒号
        Inc(Key);
        seed1:=Power(m_CryptTable[(CryptIndex shl 8)+ch],(seed1+seed2));
        seed2:=ch+seed1+seed2+(seed2 shl 5)+3; 
      end; 
      Result:=seed1;
    end;
      

  7.   

    能不能再说下 这个头文件怎么转换 typedef struct _AXPHeader
    {
    int signature;
    int nUnknow0;
    int nUnknow1;
    int nHashTableOffset;
    int nIndexTableOffset;
    int nFileCount;
    int nSizeOfIndexTable;
    int nDataOffset;
    int nUnknow3;
    int nUnknow4;
    }AXPHeader;

    typedef struct _AXPHashTable
    {
    DWORD nHashA;
    DWORD nHashB;
    DWORD bExists;
    }AXPHashTable;

    typedef struct _AXPFileInfo
    {
    int nFileOffset;
    int nFileSize;
    int nFileFlag;  
    }AXPFileInfo;
    AXPHashTable **m_lpAxpHashTable;
    AXPFileInfo **m_lpAxpFileInfo;下面是我自己转换的 AXPHeader = packed record
        signature: integer;     
        nUnknow0: integer;
        nUnknow1: integer;
        nHashTableOffset: integer;
      nIndexTableOffset: integer;
    nFileCount: integer;   
    nSizeOfIndexTable: integer;
    nDataOffset: integer;
    nUnknow3: integer;
    nUnknow4: integer;
      end;  AXPHashTable = packed record
      nHashA: DWORD;
        nHashB: DWORD;
        bExists: DWORD;
      end;  AXPFileInfo = packed record
      nFileOffset: Integer;
        nFileSize: Integer;
        nFileFlag: Integer;
      end;但是下面那几个定义不知道怎么转换 AXPHashTable **m_lpAxpHashTable;
    AXPFileInfo **m_lpAxpFileInfo;有一个*号的   有两个**的
      

  8.   

      AXPHeader = packed record
        signature: integer;
        nUnknow0: integer;
        nUnknow1: integer;
        nHashTableOffset: integer;
        nIndexTableOffset: integer;
        nFileCount: integer;
        nSizeOfIndexTable: integer;
        nDataOffset: integer;
        nUnknow3: integer;
        nUnknow4: integer;
      end;
      PAXPHeader = ^AXPHeader;  AXPHashTable = packed record
        nHashA: DWORD;
        nHashB: DWORD;
        bExists: DWORD;
      end;
      PAXPHashTable = ^AXPHashTable;  AXPFileInfo = packed record
          nFileOffset: Integer;
        nFileSize: Integer;
        nFileFlag: Integer;
      end;
      PAXPFileInfo = ^AXPFileInfo;
    var
      m_lpAxpHashTable: ^PAXPHashTable;
      m_lpAxpFileInfo: ^PAXFileInfo;