c# を使用して16-CRC [DNP]を実装しようとしてgenerator polynomial
います。
16-crc の標準的な解決策を見つけました : [ソース]
public class Crc16
{
const ushort polynomial = 0xA001;
ushort[] table = new ushort[256];
public ushort ComputeChecksum ( byte[] bytes )
{
ushort crc = 0;
for ( int i = 0; i < bytes.Length; ++i )
{
byte index = ( byte ) ( crc ^ bytes[i] );
crc = ( ushort ) ( ( crc >> 8 ) ^ table[index] );
}
return crc;
}
public byte[] ComputeChecksumBytes ( byte[] bytes )
{
ushort crc = ComputeChecksum ( bytes );
return BitConverter.GetBytes ( crc );
}
public Crc16 ()
{
ushort value;
ushort temp;
for ( ushort i = 0; i < table.Length; ++i )
{
value = 0;
temp = i;
for ( byte j = 0; j < 8; ++j )
{
if ( ( ( value ^ temp ) & 0x0001 ) != 0 )
{
value = ( ushort ) ( ( value >> 1 ) ^ polynomial );
}
else
{
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
}
ここで、多項式を変換すると1 0011 1101 0110 0111
=>が得られ(3D65)h
、私の質問は、特定の多項式に対して上記のソリューションを機能させるために何を変更する必要があるかです。
Edit
: また、2 つのことを考慮する必要があります。
1) 初期値は 0 &
2) 最終 CRC を補完する必要があります。