看这段代码

tataishan 2009-11-09 09:30:11
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
...全文
181 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
墨梅无痕 2009-11-15
  • 打赏
  • 举报
回复
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;
hjkto 2009-11-10
  • 打赏
  • 举报
回复
up
tataishan 2009-11-10
  • 打赏
  • 举报
回复
我可以再加分
tataishan 2009-11-10
  • 打赏
  • 举报
回复
能不能再说下 这个头文件怎么转换

	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;


有一个*号的 有两个**的。。。
tataishan 2009-11-10
  • 打赏
  • 举报
回复
原来 C++里面 !=是不等于啊 。。。

恩 只要答题翻译出来就可以 细节我自己在检查

有问题我会在问你的
wooden954 2009-11-10
  • 打赏
  • 举报
回复
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;
wooden954 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tataishan 的回复:]
while(FileName[key]!=#0) do  这句是不是要改改。。。  delphi没!=这种用法吧
[/Quote]
的确应该改改,可以这样
while(FileName[key]<>#0) do
wooden954 2009-11-10
  • 打赏
  • 举报
回复
再次纠正第一段的函数定义错误:

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;


注:以上翻译可能存在语法错误,请检查,但我认为大体思路是正确的。
tataishan 2009-11-10
  • 打赏
  • 举报
回复
while(FileName[key]!=#0) do 这句是不是要改改。。。 delphi没!=这种用法吧
wooden954 2009-11-10
  • 打赏
  • 举报
回复
函数定义写错了,应该是
Function HashString(FileName:PChar,Cardinal CryptIndex):Cardinal;
wooden954 2009-11-10
  • 打赏
  • 举报
回复
第一个函数:

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;
tataishan 2009-11-10
  • 打赏
  • 举报
回复
大侠来看看啊 没人能转吗
tataishan 2009-11-10
  • 打赏
  • 举报
回复
tataishan 2009-11-09
  • 打赏
  • 举报
回复
iamduo 2009-11-09
  • 打赏
  • 举报
回复
我就来看看。
飘过。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧