Прокомментировать циклический избыточный код - C#
Формулировка задачи:
Please объясните как строится таблица и как вычисляется crc?
public static uint CalculateCRC(System.IO.Stream stream)
{
const int buffer_size = 1024;
const uint POLYNOMIAL = 0xEDB88320;
uint result = 0xFFFFFFFF;
uint Crc32;
byte[] buffer = new byte[buffer_size];
uint[] table_CRC32 = new uint[256];
unchecked
{
//
// Инициалиазация таблицы
//
for (int i = 0; i < 256; i++)
{
Crc32 = (uint)i;
for (int j = 8; j > 0; j--)
{
if ((Crc32 & 1) == 1)
Crc32 = (Crc32 >> 1) ^ POLYNOMIAL;
else
Crc32 >>= 1;
}
table_CRC32[i] = Crc32;
}
//
// Чтение из буфера
//
int count = stream.Read(buffer, 0, buffer_size);
//
// Вычисление CRC
//
while (count > 0)
{
for (int i = 0; i < count; i++)
{
result = ((result) >> 8)
^ table_CRC32[(buffer[i])
^ ((result) & 0x000000FF)];
}
count = stream.Read(buffer, 0, buffer_size);
}
}
return ~result;
}
}
}Решение задачи: «Прокомментировать циклический избыточный код»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CRC_TestProgram
{
public enum Crc16Mode : ushort { Standard = 0xA001, CcittKermit = 0x8408 }
public class Crc16Ccitt
{
static ushort[] table = new ushort[256];
public ushort ComputeChecksum(params 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 Crc16Ccitt(Crc16Mode mode)
{
ushort polynomial = (ushort)mode;
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;
}
}
}
}