Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Nick_Volkov
0 / 0 / 0
Регистрация: 10.02.2017
Сообщений: 32
1

CRC16

29.01.2018, 11:23. Просмотров 2182. Ответов 2
Метки нет (Все метки)

Есть код предназначенный для проверки целостности данных. Можете объяснить принцип действия или пример кода в C#
Массивы array[] of byte;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Function crc16(length:Longint;no:short;crctmp:word):word;
var
crc:word;
i,j:short;
begin
crc:=crctmp;
  for i:=0 to length-1 do begin
    if no=1 then begin
    crc:=crc xor word(Data[i]);
    end
    else if no=2 then begin
    crc:=crc xor word(LTH_array[i]);
    end
    else if no=3 then begin
    crc:=crc xor word(PW[i]);
    end
    else if no=4 then begin
    crc:=crc xor word(TOR[i]);
    end;
    for j:=0 to 7 do begin
      if  (crc and 1)>0 then begin
      crc:= crc shr 1;
      crc:= crc xor $a001;
      end
      else begin
      crc:= crc shr 1;
      end;
    end;
  end;
crc16:=crc;
end;
 
// Циклический избыточный код (англ. Cyclic redundancy check, CRC[1]) —
// алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных
Function CRC_CHECK():word;
var
tmp: word;
begin
tmp:=crc16(DATALENGTH,1,$ffff);
tmp:=crc16(LTH_TBL_LENGTH,2,tmp);
tmp:=crc16(PW_LENGTH,3,tmp);
CRC_CHECK:=crc16(TOR_LENGTH,4,tmp);
end;
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2018, 11:23
Ответы с готовыми решениями:

Ошибка в расчёте CRC16
есть код расчета CRC 16 public static void GetCRC16(byte message, ref byte CRC16) { ...

Как можно подсчитать crc16?
Здравствуйте. Подскажите пожалуйста как можно подсчитать crc16 в C#. И где можно найти исходник.

CRC16
Необходим пример расчета CRC16 расписанный на листочке в подробностях

CRC16
Здравствуйте. На данном сайте есть программа расчёта CRC16, в которой используется таблица. А как...

Вычисление CRC16
#include <stddef.h> #include <stdint.h> #include <iostream> #include <process.h> using...

2
Sanya_sa
Модератор
782 / 723 / 310
Регистрация: 03.02.2015
Сообщений: 4,716
Записей в блоге: 8
Завершенные тесты: 3
29.01.2018, 11:36 2
Лучший ответ Сообщение было отмечено Nick_Volkov как решение

Решение

Вот Вам пример из моего проекта, все работает, сам код класса брал, по моему на Wiki.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
 
namespace CalculationCrc
{
    /// <summary>
    ///  CRC 16 CITT
    /// </summary>
    public class Crc16Ccitt
    {
        const ushort poly   = 0x1021;
        ushort[] table      = new ushort[256];
 
        /// <summary>
        /// Вычислить контрольную сумму
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public ushort ComputeChecksum(byte[] bytes)
        {
            ushort crc = 0xFFFF;
 
            foreach (var it in bytes)
            {
                crc = (ushort)((crc << 8) ^ table[((crc >> 8) ^ (0xff & it))]);
            }
 
            return crc;
        }
 
        /// <summary>
        /// Вычисление байтов контрольной суммы
        /// </summary>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public byte[] ComputeChecksumBytes(byte[] bytes)
        {
            ushort crc = ComputeChecksum(bytes);
            return BitConverter.GetBytes(crc);
        }
 
        /// <summary>
        /// CRC 16 CITT
        /// </summary>
        /// <param name="initialValue"></param>
        public Crc16Ccitt()
        {
            ushort temp, a;
            for (int i = 0; i < table.Length; ++i)
            {
                temp = 0;
                a = (ushort)(i << 8);
                for (int j = 0; j < 8; ++j)
                {
                    if (((temp ^ a) & 0x8000) != 0)
                    {
                        temp = (ushort)((temp << 1) ^ poly);
                    }
                    else
                    {
                        temp <<= 1;
                    }
                    a <<= 1;
                }
                table[i] = temp;
            }
        }
    }
}
0
Nick_Volkov
0 / 0 / 0
Регистрация: 10.02.2017
Сообщений: 32
29.01.2018, 11:39  [ТС] 3
Спасибо, будем изучать!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2018, 11:39

вопрос по CRC16
считаю контрольную сумму пакета по стандартному алгоритму: char * Buffer; crctable {........};...

алгоритм crc16
Помогите реализовать алгоритм crc16 на java. Помогите с расчетом crc-16. До этого ни разу не...

Контрольная сумма CRC16
Всем доброго времени суток, нужно посчитать контрольную сумму, я уже измучился, не понимаю почему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru