Как создать таблицу Crc-64, содержащую все отрицательные целые константы и контрольную сумму?
У меня есть пример кода для генератора таблиц 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;
}
1 ответ
У меня есть код для работы. Нет таблицы. 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;
}
}
}