标签: crc

查找使用哪个校验和

我和其他一些人一起试图为游戏制作一个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
查看次数

为什么使用xor和文字而不是反转(按位不是)

我遇到过这个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)

c c++ crc bitwise-operators

11
推荐指数
2
解决办法
879
查看次数

是否有校验和算法也支持"减去"数据?

我有一个大约有1亿个文档的系统,我想跟踪它们在镜像之间的修改.为了有效地交换有关修改的信息,我希望按天而不是每个单独的文档发送有关修改文档的信息.像这样的东西:

[ 2012/03/26, cs26],
[ 2012/03/25, cs25],
[ 2012/03/24, cs24],
...
Run Code Online (Sandbox Code Playgroud)

其中每个cs是特定日期创建的所有文档的时间戳的校验和.

现在,我遇到的问题是我不知道在删除文档时可以从校验和中"减去"数据的算法.由于显而易见的原因,没有一个加密哈希符合需要,我找不到任何能够做到这一点的CRC算法.

我考虑的一个选项是删除向哈希添加额外信息,但这会导致更多问题,因为节点可以以不同的顺序接收删除请求,并且当节点重新启动时,它将重新读取所有时间戳.文档,因此有关删除的信息将丢失.

我也不喜欢在内存中使用带有所有文档哈希的哈希树,因为这将使用大约8演出的内存,我认为这对于这种需求来说有点过分.

目前最好的选择似乎是在后台完全不时地重新生成这些哈希值,但这也是很多不必要的开销,并且不会提供有关更改的即时信息.

那么,你们知道校验和算法会让我从校验和中"删除"一些数据吗?我需要算法有点快,校验和强烈表明最小的变化(这就是我不能真正使用普通XOR的原因).

或许你对整个设计有更好的想法?

algorithm hash checksum crc

10
推荐指数
1
解决办法
343
查看次数

是否有分布式密钥生成的GUID替代方案?

我的情况是:

  1. 我有许多客户端应用程序,它们使用的是本地数据库(MS SQL,MS Access - 抱歉,这是Enterprise系统,我必须支持遗留...)
  2. 我不知道客户之间的任何趋势 - 现在它是~10但是一年可能是~100.
  3. 这些表中的数据来到我的中央服务器,并放在一个公共表中
  4. 有时现有(客户端)数据已更改 - 我必须执行更新/删除操作
  5. 我不想使用GUID(.NET类型System.Guid) - 很难在MS Access上简单地实现和支持.此外,它对性能不利
  6. 我需要快速搜索该公用表,因此使用intlong int作为PK 会很好

所以,我想:

  1. 避免碰撞的独特之处(它将被用作PK)
  2. 它应该是int或希望long int
  3. 在插入之前必须是可分配的客户端

我目前的解决方案是从以下连接中获取CRC:

  • ProcessodID
  • Bios日期
  • 用户名(字符串,硬件\用户相关数据)
  • DateTime.Now(UNC)

目前它适用于我,但也许有更好的方法来实现我的目标?您自己的任何评论,建议,示例或经验?

更新:客户端和服务器之间的同步是定期操作,因此每天可以发生2-3次(它的配置变量)

.net c# database guid crc

10
推荐指数
1
解决办法
1194
查看次数

如何获得CRC64分布式计算(使用其线性属性)?

我需要对存储在分布式FS上的相当大的文件进行哈希处理.我能够以比整个文件更好的性能处理文件的部分,所以我希望能够计算部分的哈希值然后求和.

我正在考虑CRC64作为散列算法,但我不知道如何使用其理论上的"线性函数"属性,因此我可以对文件的各个部分求和.有什么建议?我错过了什么?

附加说明我为什么看CRC64:

  • 我可以控制文件块,但由于应用程序性质,它们需要具有不同的大小(最多1个字节,不可能有任何固定块).
  • 我知道CRC32implementation(zlib),其中包括对部分CRC进行求和的方法,但我想要更广泛的东西.8个字节对我来说很好看.
  • 我知道CRC非常快.我希望从中获利,因为文件可能非常庞大(高达几Gb).

c java hash crc distributed-computing

10
推荐指数
2
解决办法
5864
查看次数

大多数静态数据流的CRC计算

背景:

我有一段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)

我知道这个公式不起作用(尝试过),但我希望存在类似的东西.

checksum crc

10
推荐指数
2
解决办法
2889
查看次数

如何准确计算PNG CRC?

在过去的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)

c# crc32 png crc

10
推荐指数
1
解决办法
5451
查看次数

快速CRC算法?

我想用ASCII字符串创建一个32位数字.CRC32算法正是我正在寻找的,但我不能使用它,因为它需要的表太大了(它适用于资源很少的嵌入式系统).

那么:对快速而纤薄的CRC算法的任何建议?与原始CRC32相比,何时碰撞更可能无关紧要.

谢谢!

c c++ crc32 crc

10
推荐指数
1
解决办法
2万
查看次数

反转CRC32

我正在寻找一种方法来反转CRC32校验和.有解决方案,但它们要么写得很糟糕,要么非常技术性和/或在装配中.汇编(目前)超出了我的范围,所以我希望有人可以用更高级别的语言拼凑一个实现.Ruby是理想的,但我可以解析PHP,Python,C,Java等.

任何接受者?

algorithm crc32 reverse reverse-engineering crc

9
推荐指数
2
解决办法
3万
查看次数

获取字节数组的CRC校验和并将其添加到该字节数组

我有这个字节数组:

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)

java checksum modbus crc

9
推荐指数
1
解决办法
2万
查看次数