Я не могу понять, почему теория и реализация CRC не являются indentical? Я имею в виду, в реализациях, которые я нахожу, сначала выполняю битрейт, а затем xor. Но первый бит не будет сохранен. И в объяснении xor начиная с первого бит. Вот мой код для CRC4Реализация CRC (порядок смещения бит)
public enum CRC4_POLY
{
CRC4 = 0x0B //1011
};
public class CRC4Calc
{
private byte[] table = new byte[16];
public byte Checksum(params byte[] val)
{
if (val == null)
throw new ArgumentNullException("val");
byte c = 0;
foreach (byte b in val)
{
c = table[c^b];
}
return c;
}
public byte[] Table
{
get
{
return this.table;
}
set
{
this.table = value;
}
}
public byte[] GenerateTable(CRC4_POLY polynomial)
{
byte[] csTable = new byte[16];
for (int i = 0; i < 16; ++i)
{
int curr = i;
for (int j = 0; j < 4; ++j)
{
if ((curr & 0x8) != 0)
{
curr = ((curr << 1) & 0x0F)^(int)polynomial; // why not?: curr = ((curr^(int)polynomial) <<1) & 0x0F;
}
else
{
curr <<= 1;
}
}
csTable[i] = (byte)curr;
}
return csTable;
}
public CRC4Calc(CRC4_POLY polynomial)
{
this.table = this.GenerateTable(polynomial);
}
}
спасибо. После вашего поста я провел больше исследований и обнаружил, что в своей реализации я использую x^4 + x^3 + x + 1 (не x^3 + x + 1, как я думал)! –