C# 如何生成包含所有负整数常量和校验和的Crc-64表?

C# 如何生成包含所有负整数常量和校验和的Crc-64表?,c#,implementation,negative-integer,crc64,C#,Implementation,Negative Integer,Crc64,我有一些Crc-64表生成器的示例代码。我尝试检查无符号整数的符号,发现它会生成混合表常量,包括负整数和正整数。与Crc-64校验和相同,它可以是负数或正数。是否可以实现一个改进的Crc-64表生成器,该生成器应生成所有负符号常量和校验和?或者所有正符号常量和校验和。请帮助我提供一些信息和示例实现 以下是Crc-64表格生成器的示例代码: public class Crc64 { public const UInt64 POLYNOMIAL = 0xD800000000000000;

我有一些Crc-64表生成器的示例代码。我尝试检查无符号整数的符号,发现它会生成混合表常量,包括负整数和正整数。与Crc-64校验和相同,它可以是负数或正数。是否可以实现一个改进的Crc-64表生成器,该生成器应生成所有负符号常量和校验和?或者所有正符号常量和校验和。请帮助我提供一些信息和示例实现

以下是Crc-64表格生成器的示例代码:

public class Crc64
{
    public const UInt64 POLYNOMIAL = 0xD800000000000000;
    public UInt64[] CRCTable;

    public Crc64()
    {
            this.CRCTable = new ulong[256];
            for (int i = 0; i <= 255; i++)
            {
                int j;
                UInt64 part = (UInt64)i;
                for (j = 0; j < 8; j++)
                {
                    if ((part & 1) != 0)
                        part = (part >> 1) ^ POLYNOMIAL;
                    else
                        part >>= 1;
                }
                CRCTable[i] = part;
            }
    }
}
更新:请告知,根据我的问题,此实施是否正确:

public static List<UInt64> generateCrcTable(UInt64 POLY)
{
    const ulong TOPBIT_MASK = 0x8000000000000000;
    const ulong LOWBIT_MASK = 0x0000000000000001;

    List<UInt64> list = new List<UInt64>();

    for (int i = 0; i <= 255; i++)
    {
        UInt64 part = (UInt64)(i);            // << 56;

        for (byte bit = 0; bit < 63; bit++)
        {
            if ((part & LOWBIT_MASK) != 0) // 0x8000000000000000) != 0) //1) != 0) // 0x8000000000000000) != 0)
            {
                part >>= 1;
                part ^= POLY;
            }
            else
            {
                part >>= 1;
                //currentValue |= 0x8000000000000000;
            }
        }

        part |= TOPBIT_MASK; // 0x8000000000000000;

        list.Add(part);
    }
    return list;
}

我有代码要用。没有桌子。crc2始终为零。我运行了两次CRC。创建CRC后,将CRC添加到原始数据中。然后再次运行以验证

如果您只需要63位,则将移位从56更改为55。然后使用以0x4而不是0x8开头的掩码。然后返回并使用0x7FFFFFFFFFFFFFFF

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rand = new Random();

            List<byte> data = Enumerable.Range(0, 1000).Select(x => (byte)rand.Next(0,256)).ToList();
            ulong crc = Crc64.ComputeCrc64(data);
            List<byte> results = new List<byte>();
            for (int i = 7; i >= 0; i--)
            {
                results.Add((byte)((crc >> (8 * i)) & 0xFF));
            }
            data.AddRange(results);

            ulong crc2 = Crc64.ComputeCrc64(data);
        }
    }
    public class Crc64
    {
        const ulong POLYNOMIAL = 0xD800000000000000;
        public static ulong ComputeCrc64(List<byte> data)
        {
            ulong crc = 0; /* CRC value is 64bit */
            foreach (byte b in data)
            {
                crc ^= (ulong)b << 56; /* move byte into MSB of 63bit CRC */
                for (int i = 0; i < 8; i++)
                {
                    if ((crc & 0x8000000000000000) != 0) /* test for MSB = bit 63 */
                    {
                        crc = (ulong)((crc << 1) ^ POLYNOMIAL);
                    }
                    else
                    {
                        crc <<= 1;
                    }
                }
            }
            return crc;
        }
    }
}

创建一个63位CRC,并向MSB添加一个。我不知道如何做。您能提供一个示例实现吗?我认为您的代码是错误的。见阳光网站:。Youi不应该为64位CRC循环256次。循环仅63次,然后返回0x8000000。我已经阅读了您告知的文章。文章中没有提到Crc64。我的代码循环了256次,因为它处理所有256个字节以创建校验和。我不知道为什么您会告诉我,对于64位Crc,它应该只循环63次,然后是0x8000000或0x8000000。你能解释一下吗?为了让您知道,我还需要一个C示例实现来理解您告知的信息。有两个for循环。外部循环表示要添加CRC的字节数,内部循环表示CRC算法。您缺少等效的:crc^=uintb