小编Joe*_*oey的帖子

查找使用哪个校验和

我和其他一些人一起试图为游戏制作一个Savegameeditor,但我们遇到了一些问题.savegame文件包含一种校验和,我们似乎无法找到使用哪个校验和.到目前为止我们所知道的是:

  • 校验和是32位
  • 在9个不同的已保存游戏之间,除了5个字节(在文件中传播)之外,存储游戏数据完全相同,校验和被发现在1834565-1851372之间,当被解析为未记录的长度时.请注意,每个保存这5个字节的每个保存都是一个增加的数字(大多数是大约+8),但校验和不是lineair增加的.
  • 校验和似乎依赖于位置,因为当切换2个字节时游戏将文件声明为损坏
  • 我尝试了一些校验和,并得出结论它似乎不是Sum32,addler32,DJB2和CRC32,因为它们似乎都没有接近保存游戏中包含的校验和.似乎最接近包含在savegames中的校验和的校验和似乎只是将所有字节添加到unsigned long,它返回约2507737左右的值.

我想知道是否有更好的方法来查找这些文件使用哪个校验和,或者是否有人知道找出使用哪个校验和的任何提示.我目前正在尝试一些我在C++程序中的不同站点上找到的校验和.也许重要的是要知道游戏是从2004年开始,而在其他文件中它使用DJB2进行字符串哈希.根据其他人的说法,.exe似乎正在使用CRC32检查.

编辑1:一段时间后,我设法获得同一文件的924个不同版本,除了2个字节,每个保存各不相同,我还得到了这些文件的校验和,看看它对这些变化的反应如何,我列出了一个这个.(请注意,我不能手动对文件进行更改,游戏只是对其进行校验和,每次我保存文件时它将+2添加到包含不同数字的无符号长整数,这就是我创建列表的方式.)

请参阅下面列表的一部分(924中的50条记录):

>         The bytes         Checksum (as Hex and unsigned long)
>         -----------------------------
>         0x 0 0x18 0x 0    0x13DFA 81402
>         0x 0 0x19 0x 0    0x13F76 81782
>         0x 0 0x1A 0x 0    0x1406D 82029
>         0x 0 0x1B 0x 0    0x14114 82196
>         0x 0 0x1C 0x 0    0x13EC5 81605
>         0x 0 0x1D 0x 0    0x13790 79760
>         0x 0 0x1E 0x 0    0x143C1 82881
>         0x 0 …
Run Code Online (Sandbox Code Playgroud)

c++ checksum crc

11
推荐指数
1
解决办法
2871
查看次数

用C++复制部分文件

我目前正在忙于一个项目,我必须将一个部分从一个文件复制到另一个文件,所以我使用fread和fwrite为它创建了一个代码.但我遇到了一个问题:出于测试目的,我制作了一个应该复制整个文件的代码,但不知何故,代码创建的副本比原始文件大.请参阅下面的代码

             FILE *base_file;
             FILE *new_file;
             fpos_t curpos;
             int tmp;

             // Open the base file
             fopen_s(&base_file, "C:/base.dat", "rb");
             // Open the file which should contain the copy
             fopen_s(&new_file, "C:/new.dat", "w");

             // Get the filesize
             fseek(base_file, 0, SEEK_END);
             fgetpos(base_file, &curpos);
             fseek(base_file, 0, SEEK_SET);

             //Read and copy (it seems to go wrong here)
             for(int i = 0; i < curpos; i++){
                 fread (&tmp, 1, 1, base_file);
                 fwrite(&tmp, 1, 1, new_file);
             }

             fclose(base_file);
             fclose(new_file);
Run Code Online (Sandbox Code Playgroud)

基本文件为525 kb,新文件为527kb.据我所知,出现此问题的部分是在有7个nullbytes的部分之后,并且副本在某些部分之后添加了一个'0D'(十六进制).在ascii中,'0D'字符是'回车'.我想知道我的复制代码将回车符添加到文件中的原因是什么?据我所知,这个脚本应该只是工作,因为我只是读取基本文件,并直接将其复制到新文件,并且基本文件不包含这些回车.

c++ windows stdio fwrite fread

0
推荐指数
1
解决办法
1442
查看次数

标签 统计

c++ ×2

checksum ×1

crc ×1

fread ×1

fwrite ×1

stdio ×1

windows ×1