找回密码
 点一下
查看: 1088|回复: 6

如何获取地图文件的checksum?

[复制链接]
发表于 2010-9-21 12:05:25 | 显示全部楼层 |阅读模式
如何获取地图文件的checksum?有人知道算法吗?或有现成的工具吗?
发表于 2010-9-21 14:46:33 | 显示全部楼层
checksum由两部分组成,一个是异或校验(参考下面的算法),另一个是SHA-1(123后才有的)。

参与计算的文件是w3*系列文件,war3map.j和BJ、CJ文件。基本上就是这样了吧。
  1. #define LONG(c) (*(DWORD*)(&(c)))
  2. #define ROTL(x,n) (((x)<<(n))|((x)>>(32-(n))))
  3. DWORD XORRotateLeft(const BYTE* data, DWORD length)
  4. {
  5.   DWORD hash = 0L;
  6.   if (data == NULL) return 0L;
  7.   while(length > 3)
  8.    {
  9.     hash = ROTL(hash ^ LONG(*data), 3);
  10.     data += 4;
  11.     length -= 4;
  12.    }
  13.   while(length-- > 0)
  14.    {
  15.     hash = ROTL(hash ^ (*data), 3);
  16.     data++;
  17.    }
  18.   return hash;
  19. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2010-9-23 20:53:20 | 显示全部楼层
我从录像文件得到的所需地图文件的checksum是十位数的数字,例如1728954785,楼上的方法我还是不明白,能把例子写详细点吗?
回复

使用道具 举报

发表于 2010-9-24 00:56:18 | 显示全部楼层
异或校验的值长度是32bit,SHA-1的值是160bit,加起来是192bit这样子。

你说的从rep文件里读出的是十位数字,我猜大概是你用的是比较旧的库吧,只是读了异或校验的值。
回复

使用道具 举报

发表于 2010-9-24 00:59:43 | 显示全部楼层
打开一个文件,把文件的内容读到数组data里去,然后调用上面的函数,得到这个文件的checksum。

上面提到的文件全部计算其checksum,把所有checksum异或起来得到地图的checksum。
回复

使用道具 举报

 楼主| 发表于 2010-9-24 19:18:40 | 显示全部楼层
能否留个QQ?QQ上请教你
回复

使用道具 举报

发表于 2010-9-24 22:58:53 | 显示全部楼层
好吧,好久没用QQ了


512140558
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-6-19 09:02 , Processed in 0.029827 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表