首页
社区
课程
招聘
[求助]关于CRC64算法
发表于: 2017-8-23 15:15 7803

[求助]关于CRC64算法

2017-8-23 15:15
7803

我有一段数据 我自己计算的和程序计算的不一样

我的C版本和JAVA版本计算的也不一样,蒙圈了,谁有现成的代码,帮我算一下可以吗?

数据

chatimg:44F2D2EA8BBDB04D56236E62B98E6A1B

C版本结果  代码地址: cd3K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0M7$3c8F1i4K6u0W2L8X3g2@1i4K6u0r3L8o6p5H3x3U0R3K6z5o6j5^5x3o6c8Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3k6r3g2@1j5h3W2D9M7#2)9J5c8U0f1H3y4K6b7^5y4K6t1@1

879BD001A16D4B20

JAVA版结果 代码地址: 6fcK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0M7$3c8F1i4K6u0W2L8X3g2@1i4K6u0r3M7$3A6A6j5h3&6Y4x3U0p5@1x3W2)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3V1k6V1k6i4c8S2K9h3I4K6i4K6u0r3z5o6p5J5z5o6b7J5z5l9`.`.

  public static final String Crc64String(String paramString)

  {

    return Long.toString(Crc64Long(paramString), 16);

  }

java版是toString后的结果

-362868a8b5c9484d



正确结果

-57c054443d9021e


这个是程序中的代码

public class Utils
{
  private static long[] CRCTable = new long[256];
  private static final long INITIALCRC = -1L;
  private static final long POLY64REV = -7661587058870466123L;
  public static final String TAG = "URLDrawable.Utils";
  private static boolean init = false;
  
  public static final long Crc64Long(String paramString)
  {
    if ((paramString == null) || (paramString.length() == 0))
    {
      l2 = 0L;
      return l2;
    }
    long l2 = -1L;
    int i;
    if (!init) {
      i = 0;
    }
    int j;
    for (;;)
    {
      if (i >= 256)
      {
        init = true;
        j = paramString.length();
        i = 0;
        l1 = l2;
        for (;;)
        {
          l2 = l1;
          if (i >= j) {
            break;
          }
          int k = paramString.charAt(i);
          l1 = CRCTable[(((int)l1 ^ k) & 0xFF)] ^ l1 >> 8;
          i += 1;
        }
      }
      l1 = i;
      j = 0;
      if (j < 8) {
        break label121;
      }
      CRCTable[i] = l1;
      i += 1;
    }
    label121:
    if (((int)l1 & 0x1) != 0) {}
    for (long l1 = l1 >> 1 ^ 0xAC4BC9B5;; l1 >>= 1)
    {
      j += 1;
      break;
    }
  }

请问为什么会这样呢?实在是想不通~~



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 60
活跃值: (524)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
2
求指点
2017-8-23 16:32
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

3edK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0t1I4K9h3y4Q4x3X3g2U0L8$3#2Q4x3V1k6@1L8$3!0D9M7#2)9J5c8V1S2G2N6q4N6o6x3#2)9#2k6W2j5I4i4K6u0W2x3U0y4Q4x3X3g2Z5N6r3#2D9


它可以自动生成任意CRC表格或C语言源码。

2017-8-23 22:50
0
雪    币: 4546
活跃值: (5699)
能力值: ( LV13,RANK:437 )
在线值:
发帖
回帖
粉丝
4
找到原因了吗
2018-1-26 11:58
0
雪    币: 9616
活跃值: (3927)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

翻译了一下,可以了,我也在研究这个,多交流:

#include <windows.h>
#include <stdio.h>

long long Crc64Long(char *instr)
{
    long long CRCTable[256] = { 0 };
    long long INITIALCRC = -1;
    long long PLOY64REV = -7661587058870466123LL;
    BOOL init = FALSE;
    if (instr == NULL)
    {
        return 0;
    }
    long long crc = -1;
    if (!init)
    {
        for (int i = 0; i < 256; i++)
        {
            long long part = (long long)i;
            for (int j = 0; j < 8; j++)
            {
                if ((((int)part) & 1) != 0)
                {
                    part = (part >> 1) ^ PLOY64REV;
                }
                else
                {
                    part >>= 1;
                }
            }
            CRCTable[i] = part;
        }
        init = TRUE;
    }
    int length = strlen(instr);
    for (int k = 0; k < length; k++)
    {
        crc = CRCTable[(((int)crc) ^ instr[k]) & 255] ^ (crc >> 8);
    }
    return crc;
}

char * Crc64String(char *instr)
{
    char *outstr = (char *)malloc(21*sizeof(char));
    long long Crc64Val = Crc64Long(instr);
    //printf("'%s' CRC64 => %lld\n", instr, Crc64Val);
    if (Crc64Val > 0LL)
    {
        sprintf_s(outstr, 21, "%llx", Crc64Val);
    }
    else
    {
        sprintf_s(outstr, 21, "-%llx", -Crc64Val);
    }

    return outstr;
}

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        printf("Usage : Crc64String [stringNeedCalc]\n");
        return -1;
    }
    char *stringNeedCalc = argv[1];
    printf("'%s' CRC64 is : %s\n", stringNeedCalc, Crc64String(stringNeedCalc));
    getchar();
}
最后于 2020-2-6 18:52 被tomggx编辑 ,原因: 更正代码
2020-2-6 18:49
0
游客
登录 | 注册 方可回帖
返回