首页
社区
课程
招聘
VFP的APP文件头最后一个WORD表示的校验和是怎样计算出来的啊
发表于: 2006-11-15 16:04 7147

VFP的APP文件头最后一个WORD表示的校验和是怎样计算出来的啊

2006-11-15 16:04
7147
收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶!
顶到高人出现!
2006-11-16 10:24
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最初由 行者孙 发布
在论坛里有个人也问了同样的问题,他说自己后来解决了,而且给出了汇编的代码,可我汇编看不懂
,哪位高手能说下计算的过程吗?


老流氓的定义:
//---------------------------------------------------------------------------
//
// FOX Header struct define
//
//---------------------------------------------------------------------------
typedef struct
{        WORD        Magic;                                        // 00,FOX文件标识:FE F2
        BYTE        Flag;                                        // 02,FOX类型:"加密类型" EE或者 "未加密类型"FF
        WORD        Version;                                // 03,FOX版本
        WORD        NumOfFiles;                                // 05,文件列表中定义的文件个数
        WORD        OrdOfMainPrg;                                // 07,主文件的序号
        DWORD        EndPosOfBlob;                                // 09,字符串信息的结束位置
        DWORD        StartPosOfBlob;                                // 0D,字符串信息的起始位置
        DWORD        SizeOfBlob;                                // 11,字符串信息的长度
        BYTE        Reserved[0x12];                                // 15,保留字节
        WORD        CheckSum;                                // 27,校验和
} FOX_HEADER,* PFOX_HEADER;

WORD CalcCheckSum(PFOX_HEADER pFoxHeader)
{        return CalcFoxCheckSum(pFoxHeader,0xFEF2,0x25);
}

WORD SwapByte(WORD wCheckSum)
{
        return (((BYTE)wCheckSum << 8) + ((wCheckSum >> 8) & 0x0FF)) & 0x0FFFF;
}

WORD CalcFoxCheckSum(PFOX_HEADER pFoxHeader,WORD wInitKey,int nSize)
{       
        PBYTE pHeader = (PBYTE)pFoxHeader;
        int i = nSize;
        WORD wCheckSum = wInitKey;
        do
        {
                wCheckSum = SwapByte(wCheckSum);
                wCheckSum = (*pHeader) ^ wCheckSum;
                wCheckSum ^= (((BYTE)wCheckSum >> 4) & 0x0F);
                wCheckSum ^= (((BYTE)wCheckSum ^ (wCheckSum << 7)) << 5 );
                pHeader ++;
                i --;
        }while(i > 0);

        return wCheckSum;
}
2006-11-16 13:39
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
十分感阿明,同时支持你对FOXER做的贡献!

2006-11-16 14:21
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
测试成功!
2006-11-17 11:28
0
游客
登录 | 注册 方可回帖
返回