我和其他一些人一起试图为游戏制作一个Savegameeditor,但我们遇到了一些问题.savegame文件包含一种校验和,我们似乎无法找到使用哪个校验和.到目前为止我们所知道的是:
我想知道是否有更好的方法来查找这些文件使用哪个校验和,或者是否有人知道找出使用哪个校验和的任何提示.我目前正在尝试一些我在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) 我遇到过这个CRC32代码,很好奇为什么作者会选择使用它
crc = crc ^ ~0U;
Run Code Online (Sandbox Code Playgroud)
代替
crc = ~crc;
Run Code Online (Sandbox Code Playgroud)
据我所知,它们是等价的.
我甚至在Visual Studio 2010中反汇编了这两个版本.
未优化的构建:
crc = crc ^ ~0U;
009D13F4 mov eax,dword ptr [crc]
009D13F7 xor eax,0FFFFFFFFh
009D13FA mov dword ptr [crc],eax
crc = ~crc;
011C13F4 mov eax,dword ptr [crc]
011C13F7 not eax
011C13F9 mov dword ptr [crc],eax
Run Code Online (Sandbox Code Playgroud)
我也无法通过考虑每条指令所需的周期数来证明代码的合理性,因为两条指令都需要完成1个周期.实际上,xor可能因为必须从某处加载文字而受到惩罚,尽管我不确定这一点.
所以我认为它可能只是描述算法的首选方式,而不是优化......这是正确的吗?
编辑1:
因为我刚刚意识到crc变量的类型可能很重要,我在这里包括整个代码(少了查找表,太大了)所以你不必关注链接.
uint32_t crc32(uint32_t crc, const void *buf, size_t size)
{
const uint8_t *p;
p = buf;
crc = crc ^ ~0U;
while …Run Code Online (Sandbox Code Playgroud) 我有一个大约有1亿个文档的系统,我想跟踪它们在镜像之间的修改.为了有效地交换有关修改的信息,我希望按天而不是每个单独的文档发送有关修改文档的信息.像这样的东西:
[ 2012/03/26, cs26],
[ 2012/03/25, cs25],
[ 2012/03/24, cs24],
...
Run Code Online (Sandbox Code Playgroud)
其中每个cs是特定日期创建的所有文档的时间戳的校验和.
现在,我遇到的问题是我不知道在删除文档时可以从校验和中"减去"数据的算法.由于显而易见的原因,没有一个加密哈希符合需要,我找不到任何能够做到这一点的CRC算法.
我考虑的一个选项是删除向哈希添加额外信息,但这会导致更多问题,因为节点可以以不同的顺序接收删除请求,并且当节点重新启动时,它将重新读取所有时间戳.文档,因此有关删除的信息将丢失.
我也不喜欢在内存中使用带有所有文档哈希的哈希树,因为这将使用大约8演出的内存,我认为这对于这种需求来说有点过分.
目前最好的选择似乎是在后台完全不时地重新生成这些哈希值,但这也是很多不必要的开销,并且不会提供有关更改的即时信息.
那么,你们知道校验和算法会让我从校验和中"删除"一些数据吗?我需要算法有点快,校验和强烈表明最小的变化(这就是我不能真正使用普通XOR的原因).
或许你对整个设计有更好的想法?
我的情况是:
System.Guid) - 很难在MS Access上简单地实现和支持.此外,它对性能不利int或long int作为PK 会很好所以,我想:
int或希望long int 我目前的解决方案是从以下连接中获取CRC:
目前它适用于我,但也许有更好的方法来实现我的目标?您自己的任何评论,建议,示例或经验?
更新:客户端和服务器之间的同步是定期操作,因此每天可以发生2-3次(它的配置变量)
我需要对存储在分布式FS上的相当大的文件进行哈希处理.我能够以比整个文件更好的性能处理文件的部分,所以我希望能够计算部分的哈希值然后求和.
我正在考虑CRC64作为散列算法,但我不知道如何使用其理论上的"线性函数"属性,因此我可以对文件的各个部分求和.有什么建议?我错过了什么?
附加说明我为什么看CRC64:
CRC32implementation(zlib),其中包括对部分CRC进行求和的方法,但我想要更广泛的东西.8个字节对我来说很好看.背景:
我有一段1024字节的内存.最后1020个字节将始终相同.前4个字节将改变(产品的序列号).我需要CRC-16 CCITT为整个内存部分计算(0xFFFF起始,0x1021掩码)CRC_WHOLE.
题:
是否可以仅计算前4个字节的CRC CRC_A,然后应用如下所示的函数来计算完整的CRC?我们可以假设CRC_B已知最后1020字节的校验和.
CRC_WHOLE = XOR(CRC_A, CRC_B)
Run Code Online (Sandbox Code Playgroud)
我知道这个公式不起作用(尝试过),但我希望存在类似的东西.
在过去的4个小时里,我一直在研究CRC算法.我很确定我已经掌握了它.
我正在尝试编写一个png编码器,我不希望使用外部库进行CRC计算,也不希望使用png编码本身.
我的程序已经能够获得与教程中的示例相同的CRC.就像维基百科一样:

使用与示例中相同的多项式和消息,我能够在两种情况下产生相同的结果.我也能够为其他几个例子做这件事.
但是,我似乎无法正确计算png文件的CRC.我通过在paint中创建一个空白的,一个像素大的.png文件来测试它,并使用它的CRC作为比较.我从png的IDAT块(计算CRC)中复制了数据(和块名称),并使用png规范中提供的多项式计算了它的CRC.
png规范中提供的多项式如下:
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
Run Code Online (Sandbox Code Playgroud)
哪个应转换为:
1 00000100 11000001 00011101 10110111
Run Code Online (Sandbox Code Playgroud)
使用该多项式,我试图获得以下数据的CRC:
01001001 01000100 01000001 01010100
00011000 01010111 01100011 11101000
11101100 11101100 00000100 00000000
00000011 00111010 00000001 10011100
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
01011111 11000101 01100001 01101000 (MSB First)
10111011 00010011 00101010 11001100 (LSB First)
Run Code Online (Sandbox Code Playgroud)
这就是实际的CRC:
11111010 00010110 10110110 …Run Code Online (Sandbox Code Playgroud) 我想用ASCII字符串创建一个32位数字.CRC32算法正是我正在寻找的,但我不能使用它,因为它需要的表太大了(它适用于资源很少的嵌入式系统).
那么:对快速而纤薄的CRC算法的任何建议?与原始CRC32相比,何时碰撞更可能无关紧要.
谢谢!
我有这个字节数组:
static byte[] buf = new byte[] { (byte) 0x01, (byte) 0x04, (byte)0x00, (byte)0x01,(byte)0x00, (byte) 0x01};
Run Code Online (Sandbox Code Playgroud)
现在,该字节数组的CRC校验和应该是0x60,0x0A.我希望Java代码重新创建此校验和,但我似乎无法重新创建它.我试过crc16:
static int crc16(final byte[] buffer) {
int crc = 0xFFFF;
for (int j = 0; j < buffer.length ; j++) {
crc = ((crc >>> 8) | (crc << 8) )& 0xffff;
crc ^= (buffer[j] & 0xff);//byte to int, trunc sign
crc ^= ((crc & 0xff) >> 4);
crc ^= (crc << 12) & 0xffff;
crc ^= ((crc & 0xFF) << 5) & …Run Code Online (Sandbox Code Playgroud)