2015-08-19 6 views
1

Я не могу понять, почему теория и реализация 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); 
    } 
} 

ответ

1

верхнего битом регистра перед переключением из, то есть немного сдвинута из, определяет, является ли исключающим с тем, что по ИЛИ остается после сдвига полинома. Это как раз классическая реализация регистра сдвига.

shift register implementation

+0

спасибо. После вашего поста я провел больше исследований и обнаружил, что в своей реализации я использую x^4 + x^3 + x + 1 (не x^3 + x + 1, как я думал)! –