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
{ 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
解决方案 »
- wsdlimporter生成的接口能被其他程序调用吗?
- Delphi 简单对象问题,急!
- 生成所有5位字母的排列要用一整天的时间吗?(P4 2.4G)
- 请教sql问题
- 如何在twebbrowser控件里显示缓存网页
- DRIVER_INFO_OK是什么意思
- 兄弟们说说‘电力’的单词怎么写 !!马上就给分
- 我想学delphi,请问卖那个版本的比好好6/7?
- 用delphi怎麼能夠取得網葉上的cookie和session的直?
- 如果设置listview的item的checkbox为只读?
- fastreport 链式纸打印时,前几张对准了,后面的就对不准了,会有偏差, 是怎么回事?
- 怎么获取系统硬件维一信息
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;
Function HashString(FileName:PChar,Cardinal CryptIndex):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;
注:以上翻译可能存在语法错误,请检查,但我认为大体思路是正确的。
while(FileName[key]<>#0) do
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;
{
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;有一个*号的 有两个**的
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;