欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

引用: 最初由 行者孙 发布
在论坛里有个人也问了同样的问题,他说自己后来解决了,而且给出了汇编的代码,可我汇编看不懂
,哪位高手能说下计算的过程吗? 

老流氓的定义:
//---------------------------------------------------------------------------
//
// 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;
}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功