Калькулятор контрольных сумм - C#
Формулировка задачи:
нужно окно в которое я ввожу данные, стартовое слово, жму кнопку и мне выводится контрольная сумма СRC 16 CCITT. в чем проблема, очень туго понимаю си шарп. нашел в инете миллион различных алгоритмов, но так и не понял как ввести данные для их расчета. остановился на таком варианте.
что еще понял что это не crc16 ccitt это реверсивный метод. если можете поправьте и помогите.
using System;
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;
}
}
}Решение задачи: «Калькулятор контрольных сумм»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CRC_TestProgram {
public static class Crc16 {
//Метод расчета CRC
public static uint GetCRC16(uint polynom, uint startValue, byte[] data) {
uint crc = startValue;
for (int i = 0; i < data.Length; i++) {
crc ^= (uint)(data[i] & 0xff);
for (int j = 0; j < 8; j++) {
if ((crc & 1) != 0) {
crc = (crc >> 1) ^ polynom;
}
else {
crc = crc >> 1;
}
}
}
return crc;
}
//Метод расчета LRC
public static short CalculateLrc(byte[] data) {
if (data == null) {
throw new ArgumentNullException("data");
}
short num = 0;
foreach (byte num2 in data) {
num = (short)(num + num2);
}
return (short)((num ^ 0xffff) + 0);
}
}
}