Форум программистов, компьютерный форум CyberForum.ru

Алгоритм вычисления CRC-8 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.91
VladimirU
120 / 98 / 18
Регистрация: 14.02.2013
Сообщений: 742
17.02.2014, 21:43     Алгоритм вычисления CRC-8 #1
C++
1
2
3
4
5
6
7
8
9
10
unsigned short crc8 (unsigned short *ptr, unsigned short size )
{
unsigned short sum=0;
while(size>0)
{
sum+=ptr[size--];
sum += (sum >>1);
}
return(~sum);
}
Можно ли этот способ применить для вычисления crc8.?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2014, 21:43     Алгоритм вычисления CRC-8
Посмотрите здесь:

C++ Алгоритм для вычисления выражения
C++ Алгоритм вычисления массива значенич фукции
C++ Алгоритм вычисления значения n!
Алгоритм вычисления функции C++
C++ алгоритм вычисления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6430 / 3804 / 882
Регистрация: 30.01.2014
Сообщений: 6,604
17.02.2014, 23:38     Алгоритм вычисления CRC-8 #2
Цитата Сообщение от VladimirU Посмотреть сообщение
Можно ли этот способ применить для вычисления crc8.?
Не очень это похоже на crc. Может быть не весь код приведен, но пока мимо.
Я бы предложил вот такое решение:
C++
1
2
3
4
5
6
7
uint8_t crc8(const uint8_t (&table)[256], uint8_t *pdata, size_t nbytes, uint8_t crc)
{
    while (nbytes-- > 0)
        crc = table[(crc ^ *pdata++) & 0xff];
 
    return crc;
}
где pdata, nbytes входная последовательность и ее размер
crc - начальное значение (например 0xFF)
table - таблица crc8 рассчитанная по одному из полиномов (см. теорию)
CRC8_TABLE_SIZE = 256

Таблицу можно найти в инете или сгенерировать самому.
Пример функции генерации таблицы (MSB вариант):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void crc8_generate_table(uint8_t (&table)[CRC8_TABLE_SIZE], uint8_t poly)
{
    const uint8_t msbit = 0x80;
    table[0] = 0;
 
    uint8_t t = msbit;
    for (int i = 1; i < CRC8_TABLE_SIZE; i *= 2)
    {
        t = (t << 1) ^ (t & msbit ? poly: 0);
        for (int j = 0; j < i; ++j)
            table[i+j] = table[j] ^ t;
    }
}
VladimirU
120 / 98 / 18
Регистрация: 14.02.2013
Сообщений: 742
18.02.2014, 19:08  [ТС]     Алгоритм вычисления CRC-8 #3
DrOffset, мне бы таблицу применять не хотелось из за ограничении памяти хранения программы.
А вот такой подход может являться расчётом crc:

"Для примера рассчитаем контрольную сумму нескольких 8-битных слов: 0x39, 0xf8, 0x14, 0xc2. Находим их сумму с поразрядным дополнением:
0x39 + 0xf8 = 0x131 → 0x31 ;
0x31 + 0x14 = 0x046 → 0x46 ;
0x46 + 0xc2 = 0x108 → 0x08 .
Теперь находим поразрядное дополнение до единицы полученного результата:
0x08 = 0000 1000 → 1111 0111 = 0xf7 или, проще — 0xff − 0x08 = 0xf7. Это и есть искомая контрольная сумма."
DrOffset
6430 / 3804 / 882
Регистрация: 30.01.2014
Сообщений: 6,604
18.02.2014, 19:42     Алгоритм вычисления CRC-8 #4
Цитата Сообщение от VladimirU Посмотреть сообщение
"Для примера рассчитаем контрольную сумму нескольких 8-битных слов: 0x39, 0xf8, 0x14, 0xc2. Находим их сумму с поразрядным дополнением:
0x39 + 0xf8 = 0x131 → 0x31 ;
0x31 + 0x14 = 0x046 → 0x46 ;
0x46 + 0xc2 = 0x108 → 0x08 .
Теперь находим поразрядное дополнение до единицы полученного результата:
0x08 = 0000 1000 → 1111 0111 = 0xf7 или, проще — 0xff − 0x08 = 0xf7. Это и есть искомая контрольная сумма."
CRC - это Cyclic redundancy check. Всего лишь один из вариантов расчета контрольной суммы. Контрольную сумму можно считать разными алгоритмами, не обязательно CRC. А твой алгоритм, я так понимаю, это контрольная сумма для UDP пакета? Если да, то можно использовать, конечно же. Но только это не CRC.
VladimirU
120 / 98 / 18
Регистрация: 14.02.2013
Сообщений: 742
18.02.2014, 20:55  [ТС]     Алгоритм вычисления CRC-8 #5
Понял.
Да точно мне надо контрольную сумму пяти 8-ми битных чисел.
Спс за помощь.
AndreyHABL
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
20.09.2016, 08:38     Алгоритм вычисления CRC-8 #6
Здравствуйте заранее извиняюсь может за глупую просьбу
Не могли бы помочь с написанием програмки вычисления CRC8 табличным методом из введенного числа
я слепил програмку но что то сам в ней запутался

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
const unsigned char Crc8Table[256] = {
    0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97,
    0xB9, 0x88, 0xDB, 0xEA, 0x7D, 0x4C, 0x1F, 0x2E,
    0x43, 0x72, 0x21, 0x10, 0x87, 0xB6, 0xE5, 0xD4,
    0xFA, 0xCB, 0x98, 0xA9, 0x3E, 0x0F, 0x5C, 0x6D,
    0x86, 0xB7, 0xE4, 0xD5, 0x42, 0x73, 0x20, 0x11,
    0x3F, 0x0E, 0x5D, 0x6C, 0xFB, 0xCA, 0x99, 0xA8,
    0xC5, 0xF4, 0xA7, 0x96, 0x01, 0x30, 0x63, 0x52,
    0x7C, 0x4D, 0x1E, 0x2F, 0xB8, 0x89, 0xDA, 0xEB,
    0x3D, 0x0C, 0x5F, 0x6E, 0xF9, 0xC8, 0x9B, 0xAA,
    0x84, 0xB5, 0xE6, 0xD7, 0x40, 0x71, 0x22, 0x13,
    0x7E, 0x4F, 0x1C, 0x2D, 0xBA, 0x8B, 0xD8, 0xE9,
    0xC7, 0xF6, 0xA5, 0x94, 0x03, 0x32, 0x61, 0x50,
    0xBB, 0x8A, 0xD9, 0xE8, 0x7F, 0x4E, 0x1D, 0x2C,
    0x02, 0x33, 0x60, 0x51, 0xC6, 0xF7, 0xA4, 0x95,
    0xF8, 0xC9, 0x9A, 0xAB, 0x3C, 0x0D, 0x5E, 0x6F,
    0x41, 0x70, 0x23, 0x12, 0x85, 0xB4, 0xE7, 0xD6,
    0x7A, 0x4B, 0x18, 0x29, 0xBE, 0x8F, 0xDC, 0xED,
    0xC3, 0xF2, 0xA1, 0x90, 0x07, 0x36, 0x65, 0x54,
    0x39, 0x08, 0x5B, 0x6A, 0xFD, 0xCC, 0x9F, 0xAE,
    0x80, 0xB1, 0xE2, 0xD3, 0x44, 0x75, 0x26, 0x17,
    0xFC, 0xCD, 0x9E, 0xAF, 0x38, 0x09, 0x5A, 0x6B,
    0x45, 0x74, 0x27, 0x16, 0x81, 0xB0, 0xE3, 0xD2,
    0xBF, 0x8E, 0xDD, 0xEC, 0x7B, 0x4A, 0x19, 0x28,
    0x06, 0x37, 0x64, 0x55, 0xC2, 0xF3, 0xA0, 0x91,
    0x47, 0x76, 0x25, 0x14, 0x83, 0xB2, 0xE1, 0xD0,
    0xFE, 0xCF, 0x9C, 0xAD, 0x3A, 0x0B, 0x58, 0x69,
    0x04, 0x35, 0x66, 0x57, 0xC0, 0xF1, 0xA2, 0x93,
    0xBD, 0x8C, 0xDF, 0xEE, 0x79, 0x48, 0x1B, 0x2A,
    0xC1, 0xF0, 0xA3, 0x92, 0x05, 0x34, 0x67, 0x56,
    0x78, 0x49, 0x1A, 0x2B, 0xBC, 0x8D, 0xDE, 0xEF,
    0x82, 0xB3, 0xE0, 0xD1, 0x46, 0x77, 0x24, 0x15,
    0x3B, 0x0A, 0x59, 0x68, 0xFF, 0xCE, 0x9D, 0xAC
};
 
unsigned char Crc8(unsigned char pcBlock, unsigned char len)
{
    unsigned char crc = 0x00;
 
    while (len-->0)
        crc = Crc8Table[crc ^ pcBlock++];
 
    return crc;
}
 
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
int pcBlock,len=1, s;
scanf ( "%d", &pcBlock );
s=Crc8( pcBlock,  len);
    printf( "Summa %x\n ravno %x\n", len, s );
    return 0;
}
HighPredator
 Аватар для HighPredator
5349 / 1732 / 320
Регистрация: 10.12.2010
Сообщений: 5,116
Записей в блоге: 3
20.09.2016, 09:14     Алгоритм вычисления CRC-8 #7
AndreyHABL, а вы основы языка вообще знаете? Вы именно что "слепили" программу. Там где надо массив принять, вы принимаете байт, который по факту инт... Код самой функции вообще не соответствует тому, что в посте выше... Подтягивайте азы.
AndreyHABL
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
22.09.2016, 06:45     Алгоритм вычисления CRC-8 #8
Пробовал так :

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
const unsigned char Crc8Table[256] = {
    0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97,
    0xB9, 0x88, 0xDB, 0xEA, 0x7D, 0x4C, 0x1F, 0x2E,
    0x43, 0x72, 0x21, 0x10, 0x87, 0xB6, 0xE5, 0xD4,
    0xFA, 0xCB, 0x98, 0xA9, 0x3E, 0x0F, 0x5C, 0x6D,
    0x86, 0xB7, 0xE4, 0xD5, 0x42, 0x73, 0x20, 0x11,
    0x3F, 0x0E, 0x5D, 0x6C, 0xFB, 0xCA, 0x99, 0xA8,
    0xC5, 0xF4, 0xA7, 0x96, 0x01, 0x30, 0x63, 0x52,
    0x7C, 0x4D, 0x1E, 0x2F, 0xB8, 0x89, 0xDA, 0xEB,
    0x3D, 0x0C, 0x5F, 0x6E, 0xF9, 0xC8, 0x9B, 0xAA,
    0x84, 0xB5, 0xE6, 0xD7, 0x40, 0x71, 0x22, 0x13,
    0x7E, 0x4F, 0x1C, 0x2D, 0xBA, 0x8B, 0xD8, 0xE9,
    0xC7, 0xF6, 0xA5, 0x94, 0x03, 0x32, 0x61, 0x50,
    0xBB, 0x8A, 0xD9, 0xE8, 0x7F, 0x4E, 0x1D, 0x2C,
    0x02, 0x33, 0x60, 0x51, 0xC6, 0xF7, 0xA4, 0x95,
    0xF8, 0xC9, 0x9A, 0xAB, 0x3C, 0x0D, 0x5E, 0x6F,
    0x41, 0x70, 0x23, 0x12, 0x85, 0xB4, 0xE7, 0xD6,
    0x7A, 0x4B, 0x18, 0x29, 0xBE, 0x8F, 0xDC, 0xED,
    0xC3, 0xF2, 0xA1, 0x90, 0x07, 0x36, 0x65, 0x54,
    0x39, 0x08, 0x5B, 0x6A, 0xFD, 0xCC, 0x9F, 0xAE,
    0x80, 0xB1, 0xE2, 0xD3, 0x44, 0x75, 0x26, 0x17,
    0xFC, 0xCD, 0x9E, 0xAF, 0x38, 0x09, 0x5A, 0x6B,
    0x45, 0x74, 0x27, 0x16, 0x81, 0xB0, 0xE3, 0xD2,
    0xBF, 0x8E, 0xDD, 0xEC, 0x7B, 0x4A, 0x19, 0x28,
    0x06, 0x37, 0x64, 0x55, 0xC2, 0xF3, 0xA0, 0x91,
    0x47, 0x76, 0x25, 0x14, 0x83, 0xB2, 0xE1, 0xD0,
    0xFE, 0xCF, 0x9C, 0xAD, 0x3A, 0x0B, 0x58, 0x69,
    0x04, 0x35, 0x66, 0x57, 0xC0, 0xF1, 0xA2, 0x93,
    0xBD, 0x8C, 0xDF, 0xEE, 0x79, 0x48, 0x1B, 0x2A,
    0xC1, 0xF0, 0xA3, 0x92, 0x05, 0x34, 0x67, 0x56,
    0x78, 0x49, 0x1A, 0x2B, 0xBC, 0x8D, 0xDE, 0xEF,
    0x82, 0xB3, 0xE0, 0xD1, 0x46, 0x77, 0x24, 0x15,
    0x3B, 0x0A, 0x59, 0x68, 0xFF, 0xCE, 0x9D, 0xAC
};
unsigned char Crc8(unsigned char *pcBlock, unsigned char len)
{
    unsigned char crc = 0xFF;
 
    while (len--)
        crc = Crc8Table[crc ^ *pcBlock++];
 
    return crc;
}
 
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
char *pcBlock,len, s;
s=Crc8(pcBlock, len);
    printf( "Summa %x\n ravno %x\n", len, s );
    return 0;
}
выдаёт ошибку, функция взята из википедии.
Алгоритм следующий: есть какое либо сообщение например введенное с клавиатуры цифрами 16777133 (десятичное), далее надо каким то образом взять первые 8 бит с этих данных в нашем случае это 11111111 принять это за адрес в нашем массиве. Данные что по этому адресу (в нашем случае это AC(10101100)) надо ксорить (XOR) со вторыми 8ми битами нашего сообщения (в нашем случае это тоже FF). Полученный результат (в нашем случае это 01010011) это новый адрес в нашем массиве. Данные что по этому адресу (в нашем случае это 2d(00101101)) надо ксорить (XOR) уже с третьими 8ми битами нашего сообщения (в нашем случае это AD). Так должно продолжаться пока не кончится сообщение, в нашем случае оно кончается. Результат и будет контрольная сумма CRC8.
HighPredator
 Аватар для HighPredator
5349 / 1732 / 320
Регистрация: 10.12.2010
Сообщений: 5,116
Записей в блоге: 3
22.09.2016, 08:05     Алгоритм вычисления CRC-8 #9
AndreyHABL, повторюсь еще раз: вам нужно взять книгу и изучать азы, а не контрольную сумму считать. Конечно будет выдавать ошибки, вы даже не в курсе, что переменные перед использованием нужно инициализировать. Вам повезло, что такой тяп-ляп слепленый код вообще скомпилировался. Не всем так прет. Короче, изучайте язык ибо на данном этапе обсуждать что-то предметно не имеет смысла.
nmcf
4299 / 3720 / 1253
Регистрация: 14.04.2014
Сообщений: 14,551
22.09.2016, 09:35     Алгоритм вычисления CRC-8 #10
AndreyHABL, ты сначала введи строку или задай константой, после уже вычисляй.
DrOffset
22.09.2016, 12:58
  #11

Не по теме:

Цитата Сообщение от HighPredator Посмотреть сообщение
Не всем так прет.
Мне кажется, если кривой код скомпилировался, то это скорее невезение, чем везение.

AndreyHABL
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
25.09.2016, 08:05     Алгоритм вычисления CRC-8 #12
Вот всё поправил:
Assembler
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
const unsigned char Crc8Table[256] = {
    0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97,
    0xB9, 0x88, 0xDB, 0xEA, 0x7D, 0x4C, 0x1F, 0x2E,
    0x43, 0x72, 0x21, 0x10, 0x87, 0xB6, 0xE5, 0xD4,
    0xFA, 0xCB, 0x98, 0xA9, 0x3E, 0x0F, 0x5C, 0x6D,
    0x86, 0xB7, 0xE4, 0xD5, 0x42, 0x73, 0x20, 0x11,
    0x3F, 0x0E, 0x5D, 0x6C, 0xFB, 0xCA, 0x99, 0xA8,
    0xC5, 0xF4, 0xA7, 0x96, 0x01, 0x30, 0x63, 0x52,
    0x7C, 0x4D, 0x1E, 0x2F, 0xB8, 0x89, 0xDA, 0xEB,
    0x3D, 0x0C, 0x5F, 0x6E, 0xF9, 0xC8, 0x9B, 0xAA,
    0x84, 0xB5, 0xE6, 0xD7, 0x40, 0x71, 0x22, 0x13,
    0x7E, 0x4F, 0x1C, 0x2D, 0xBA, 0x8B, 0xD8, 0xE9,
    0xC7, 0xF6, 0xA5, 0x94, 0x03, 0x32, 0x61, 0x50,
    0xBB, 0x8A, 0xD9, 0xE8, 0x7F, 0x4E, 0x1D, 0x2C,
    0x02, 0x33, 0x60, 0x51, 0xC6, 0xF7, 0xA4, 0x95,
    0xF8, 0xC9, 0x9A, 0xAB, 0x3C, 0x0D, 0x5E, 0x6F,
    0x41, 0x70, 0x23, 0x12, 0x85, 0xB4, 0xE7, 0xD6,
    0x7A, 0x4B, 0x18, 0x29, 0xBE, 0x8F, 0xDC, 0xED,
    0xC3, 0xF2, 0xA1, 0x90, 0x07, 0x36, 0x65, 0x54,
    0x39, 0x08, 0x5B, 0x6A, 0xFD, 0xCC, 0x9F, 0xAE,
    0x80, 0xB1, 0xE2, 0xD3, 0x44, 0x75, 0x26, 0x17,
    0xFC, 0xCD, 0x9E, 0xAF, 0x38, 0x09, 0x5A, 0x6B,
    0x45, 0x74, 0x27, 0x16, 0x81, 0xB0, 0xE3, 0xD2,
    0xBF, 0x8E, 0xDD, 0xEC, 0x7B, 0x4A, 0x19, 0x28,
    0x06, 0x37, 0x64, 0x55, 0xC2, 0xF3, 0xA0, 0x91,
    0x47, 0x76, 0x25, 0x14, 0x83, 0xB2, 0xE1, 0xD0,
    0xFE, 0xCF, 0x9C, 0xAD, 0x3A, 0x0B, 0x58, 0x69,
    0x04, 0x35, 0x66, 0x57, 0xC0, 0xF1, 0xA2, 0x93,
    0xBD, 0x8C, 0xDF, 0xEE, 0x79, 0x48, 0x1B, 0x2A,
    0xC1, 0xF0, 0xA3, 0x92, 0x05, 0x34, 0x67, 0x56,
    0x78, 0x49, 0x1A, 0x2B, 0xBC, 0x8D, 0xDE, 0xEF,
    0x82, 0xB3, 0xE0, 0xD1, 0x46, 0x77, 0x24, 0x15,
    0x3B, 0x0A, 0x59, 0x68, 0xFF, 0xCE, 0x9D, 0xAC
};
unsigned char Crc8(unsigned char pcBlock, unsigned char len)
{
    unsigned char crc = 0x00;
 
    while (len--)
        crc = Crc8Table[crc ^ pcBlock++];       
 
    return crc;
}
 
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
char pcBlock=0xffff,len=2;
char s;
s=Crc8(pcBlock, len);
    printf( "Summa %x\n ravno %x\n", len, s );
    return 0;
}
считает но не правильно, почему то не сдвигает данные и pcBlock++ после первого раза принимает за 0
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
25.09.2016, 08:35     Алгоритм вычисления CRC-8 #13
Цитата Сообщение от AndreyHABL Посмотреть сообщение
char pcBlock=0xffff
говорят же, почитай книги
char никак не может быть 16 бит

Не по теме:

теоретически может но это тема для отдельного разговора

nmcf
4299 / 3720 / 1253
Регистрация: 14.04.2014
Сообщений: 14,551
25.09.2016, 09:02     Алгоритм вычисления CRC-8 #14
C++
1
unsigned char pcBlock[2] = {0xff, 0xff}, len = 2;
AndreyHABL
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
25.09.2016, 10:11     Алгоритм вычисления CRC-8 #15
а так ?
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
const unsigned char Crc8Table[256] = {
    0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97,
    0xB9, 0x88, 0xDB, 0xEA, 0x7D, 0x4C, 0x1F, 0x2E,
    0x43, 0x72, 0x21, 0x10, 0x87, 0xB6, 0xE5, 0xD4,
    0xFA, 0xCB, 0x98, 0xA9, 0x3E, 0x0F, 0x5C, 0x6D,
    0x86, 0xB7, 0xE4, 0xD5, 0x42, 0x73, 0x20, 0x11,
    0x3F, 0x0E, 0x5D, 0x6C, 0xFB, 0xCA, 0x99, 0xA8,
    0xC5, 0xF4, 0xA7, 0x96, 0x01, 0x30, 0x63, 0x52,
    0x7C, 0x4D, 0x1E, 0x2F, 0xB8, 0x89, 0xDA, 0xEB,
    0x3D, 0x0C, 0x5F, 0x6E, 0xF9, 0xC8, 0x9B, 0xAA,
    0x84, 0xB5, 0xE6, 0xD7, 0x40, 0x71, 0x22, 0x13,
    0x7E, 0x4F, 0x1C, 0x2D, 0xBA, 0x8B, 0xD8, 0xE9,
    0xC7, 0xF6, 0xA5, 0x94, 0x03, 0x32, 0x61, 0x50,
    0xBB, 0x8A, 0xD9, 0xE8, 0x7F, 0x4E, 0x1D, 0x2C,
    0x02, 0x33, 0x60, 0x51, 0xC6, 0xF7, 0xA4, 0x95,
    0xF8, 0xC9, 0x9A, 0xAB, 0x3C, 0x0D, 0x5E, 0x6F,
    0x41, 0x70, 0x23, 0x12, 0x85, 0xB4, 0xE7, 0xD6,
    0x7A, 0x4B, 0x18, 0x29, 0xBE, 0x8F, 0xDC, 0xED,
    0xC3, 0xF2, 0xA1, 0x90, 0x07, 0x36, 0x65, 0x54,
    0x39, 0x08, 0x5B, 0x6A, 0xFD, 0xCC, 0x9F, 0xAE,
    0x80, 0xB1, 0xE2, 0xD3, 0x44, 0x75, 0x26, 0x17,
    0xFC, 0xCD, 0x9E, 0xAF, 0x38, 0x09, 0x5A, 0x6B,
    0x45, 0x74, 0x27, 0x16, 0x81, 0xB0, 0xE3, 0xD2,
    0xBF, 0x8E, 0xDD, 0xEC, 0x7B, 0x4A, 0x19, 0x28,
    0x06, 0x37, 0x64, 0x55, 0xC2, 0xF3, 0xA0, 0x91,
    0x47, 0x76, 0x25, 0x14, 0x83, 0xB2, 0xE1, 0xD0,
    0xFE, 0xCF, 0x9C, 0xAD, 0x3A, 0x0B, 0x58, 0x69,
    0x04, 0x35, 0x66, 0x57, 0xC0, 0xF1, 0xA2, 0x93,
    0xBD, 0x8C, 0xDF, 0xEE, 0x79, 0x48, 0x1B, 0x2A,
    0xC1, 0xF0, 0xA3, 0x92, 0x05, 0x34, 0x67, 0x56,
    0x78, 0x49, 0x1A, 0x2B, 0xBC, 0x8D, 0xDE, 0xEF,
    0x82, 0xB3, 0xE0, 0xD1, 0x46, 0x77, 0x24, 0x15,
    0x3B, 0x0A, 0x59, 0x68, 0xFF, 0xCE, 0x9D, 0xAC
};
unsigned char Crc8(unsigned char pcBlock, unsigned char len)
{
    unsigned char crc = 0x00;
 
    while (len--)
        crc = Crc8Table[crc ^ pcBlock++];       
        
    return crc;
}
 
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
int pcBlock=0xffff,len=2;
int s;
s=Crc8(pcBlock, len);
    printf( "Summa %x\n ravno %x\n", len, s );
    return 0;
}
как сдвигать сообщение по 8 бит?
nmcf
4299 / 3720 / 1253
Регистрация: 14.04.2014
Сообщений: 14,551
25.09.2016, 10:20     Алгоритм вычисления CRC-8 #16
Я же тебе показал как должно быть. Что даст int, там всего 4 байта? А массив можно любой длины сделать.
AndreyHABL
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
25.09.2016, 10:28     Алгоритм вычисления CRC-8 #17
Выдает ошибку если я это добавить
C++
1
unsigned char pcBlock[2] = {0xff, 0xff}, len = 2;
а pcBlock может быть любым, числовым пока что
nmcf
4299 / 3720 / 1253
Регистрация: 14.04.2014
Сообщений: 14,551
25.09.2016, 10:29     Алгоритм вычисления CRC-8 #18
Текст ошибки где?

Добавлено через 50 секунд
Указатель там должен быть:
C++
1
2
3
4
5
6
7
8
9
unsigned char Crc8(unsigned char *pcBlock, unsigned char len)
{
    unsigned char crc = 0x00;
 
    while (len--)
        crc = Crc8Table[crc ^ pcBlock++];       
        
    return crc;
}
AndreyHABL
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
25.09.2016, 10:39     Алгоритм вычисления CRC-8 #19
Можешь вставить в нужное место
C++
1
 unsigned char pcBlock[2] = {0xff, 0xff}, len = 2;
в мой код?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2016, 10:41     Алгоритм вычисления CRC-8
Еще ссылки по теме:

алгоритм вычисления C++
C++ Алгоритм вычисления времени
C++ Составить алгоритм вычисления выражения

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

Или воспользуйтесь поиском по форуму:
nmcf
4299 / 3720 / 1253
Регистрация: 14.04.2014
Сообщений: 14,551
25.09.2016, 10:41     Алгоритм вычисления CRC-8 #20
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
const unsigned char Crc8Table[256] = {
    0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97,
    0xB9, 0x88, 0xDB, 0xEA, 0x7D, 0x4C, 0x1F, 0x2E,
    0x43, 0x72, 0x21, 0x10, 0x87, 0xB6, 0xE5, 0xD4,
    0xFA, 0xCB, 0x98, 0xA9, 0x3E, 0x0F, 0x5C, 0x6D,
    0x86, 0xB7, 0xE4, 0xD5, 0x42, 0x73, 0x20, 0x11,
    0x3F, 0x0E, 0x5D, 0x6C, 0xFB, 0xCA, 0x99, 0xA8,
    0xC5, 0xF4, 0xA7, 0x96, 0x01, 0x30, 0x63, 0x52,
    0x7C, 0x4D, 0x1E, 0x2F, 0xB8, 0x89, 0xDA, 0xEB,
    0x3D, 0x0C, 0x5F, 0x6E, 0xF9, 0xC8, 0x9B, 0xAA,
    0x84, 0xB5, 0xE6, 0xD7, 0x40, 0x71, 0x22, 0x13,
    0x7E, 0x4F, 0x1C, 0x2D, 0xBA, 0x8B, 0xD8, 0xE9,
    0xC7, 0xF6, 0xA5, 0x94, 0x03, 0x32, 0x61, 0x50,
    0xBB, 0x8A, 0xD9, 0xE8, 0x7F, 0x4E, 0x1D, 0x2C,
    0x02, 0x33, 0x60, 0x51, 0xC6, 0xF7, 0xA4, 0x95,
    0xF8, 0xC9, 0x9A, 0xAB, 0x3C, 0x0D, 0x5E, 0x6F,
    0x41, 0x70, 0x23, 0x12, 0x85, 0xB4, 0xE7, 0xD6,
    0x7A, 0x4B, 0x18, 0x29, 0xBE, 0x8F, 0xDC, 0xED,
    0xC3, 0xF2, 0xA1, 0x90, 0x07, 0x36, 0x65, 0x54,
    0x39, 0x08, 0x5B, 0x6A, 0xFD, 0xCC, 0x9F, 0xAE,
    0x80, 0xB1, 0xE2, 0xD3, 0x44, 0x75, 0x26, 0x17,
    0xFC, 0xCD, 0x9E, 0xAF, 0x38, 0x09, 0x5A, 0x6B,
    0x45, 0x74, 0x27, 0x16, 0x81, 0xB0, 0xE3, 0xD2,
    0xBF, 0x8E, 0xDD, 0xEC, 0x7B, 0x4A, 0x19, 0x28,
    0x06, 0x37, 0x64, 0x55, 0xC2, 0xF3, 0xA0, 0x91,
    0x47, 0x76, 0x25, 0x14, 0x83, 0xB2, 0xE1, 0xD0,
    0xFE, 0xCF, 0x9C, 0xAD, 0x3A, 0x0B, 0x58, 0x69,
    0x04, 0x35, 0x66, 0x57, 0xC0, 0xF1, 0xA2, 0x93,
    0xBD, 0x8C, 0xDF, 0xEE, 0x79, 0x48, 0x1B, 0x2A,
    0xC1, 0xF0, 0xA3, 0x92, 0x05, 0x34, 0x67, 0x56,
    0x78, 0x49, 0x1A, 0x2B, 0xBC, 0x8D, 0xDE, 0xEF,
    0x82, 0xB3, 0xE0, 0xD1, 0x46, 0x77, 0x24, 0x15,
    0x3B, 0x0A, 0x59, 0x68, 0xFF, 0xCE, 0x9D, 0xAC
};
unsigned char Crc8(unsigned char *pcBlock, unsigned char len)
{
    unsigned char crc = 0x00;
 
    while (len--)
        crc = Crc8Table[crc ^ *(pcBlock++)];       
        
    return crc;
}
 
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    unsigned char pcBlock[2] = {0xff, 0xff}, len = 2;
    int s;
 
    s=Crc8(pcBlock, len);
 
    printf("Summa ravno %x\n", s);
    return 0;
}
Yandex
Объявления
25.09.2016, 10:41     Алгоритм вычисления CRC-8
Ответ Создать тему
Опции темы

Текущее время: 13:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru