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

[求助]关于CRC64算法

2017-8-23 15:15
7621

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

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

数据

chatimg:44F2D2EA8BBDB04D56236E62B98E6A1B

C版本结果  代码地址: http://blog.csdn.net/l1028386804/article/details/50748724

879BD001A16D4B20

JAVA版结果 代码地址: http://blog.csdn.net/sjiang2142/article/details/8128428

  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
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
2
求指点
2017-8-23 16:32
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

http://www.21ic.com/tools/HotWC3_V1.23.html


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

2017-8-23 22:50
0
雪    币: 3422
活跃值: (4544)
能力值: ( LV13,RANK:437 )
在线值:
发帖
回帖
粉丝
4
找到原因了吗
2018-1-26 11:58
0
雪    币: 8857
活跃值: (3117)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回
//