179 / 164 / 30
Регистрация: 14.02.2013
Сообщений: 1,463
1

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

17.02.2014, 21:43. Показов 30534. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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.?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2014, 21:43
Ответы с готовыми решениями:

Прощу объяснить алгоритм CRC 32
Здравствуйте разбираюсь с CRC. Почитал теорию, там все понятно и легко. Как дело дошло до практике....

Составить блок-схему, алгоритм вычисления и программу для вычисления значения кусочно заданной функции
помогите решить

Составить блок-схему, алгоритм вычисления и программу для вычисления значения кусочно заданной функции
помогите пожалуйста =) заранее благодарен =) П.5.19.Правил Запрещено создавать темы в виде ссылок...

Быстрота вычисления CRC кода
Доброго времени суток! Помогите ,пожалуйста, найти ответы на два вопроса: - Влияет ли размер файла...

19
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
17.02.2014, 23:38 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;
    }
}
0
179 / 164 / 30
Регистрация: 14.02.2013
Сообщений: 1,463
18.02.2014, 19:08  [ТС] 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. Это и есть искомая контрольная сумма."
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
18.02.2014, 19:42 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.
1
179 / 164 / 30
Регистрация: 14.02.2013
Сообщений: 1,463
18.02.2014, 20:55  [ТС] 5
Понял.
Да точно мне надо контрольную сумму пяти 8-ми битных чисел.
Спс за помощь.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
20.09.2016, 08:38 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;
}
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
20.09.2016, 09:14 7
AndreyHABL, а вы основы языка вообще знаете? Вы именно что "слепили" программу. Там где надо массив принять, вы принимаете байт, который по факту инт... Код самой функции вообще не соответствует тому, что в посте выше... Подтягивайте азы.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
22.09.2016, 06:45 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.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
22.09.2016, 08:05 9
AndreyHABL, повторюсь еще раз: вам нужно взять книгу и изучать азы, а не контрольную сумму считать. Конечно будет выдавать ошибки, вы даже не в курсе, что переменные перед использованием нужно инициализировать. Вам повезло, что такой тяп-ляп слепленый код вообще скомпилировался. Не всем так прет. Короче, изучайте язык ибо на данном этапе обсуждать что-то предметно не имеет смысла.
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
22.09.2016, 09:35 10
AndreyHABL, ты сначала введи строку или задай константой, после уже вычисляй.
0
DrOffset
22.09.2016, 12:58
  #11

Не по теме:

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

0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
25.09.2016, 08:05 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
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
25.09.2016, 08:35 13
Цитата Сообщение от AndreyHABL Посмотреть сообщение
char pcBlock=0xffff
говорят же, почитай книги
char никак не может быть 16 бит

Не по теме:

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

0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
25.09.2016, 09:02 14
C++
1
unsigned char pcBlock[2] = {0xff, 0xff}, len = 2;
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
25.09.2016, 10:11 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 бит?
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
25.09.2016, 10:20 16
Я же тебе показал как должно быть. Что даст int, там всего 4 байта? А массив можно любой длины сделать.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
25.09.2016, 10:28 17
Выдает ошибку если я это добавить
C++
1
unsigned char pcBlock[2] = {0xff, 0xff}, len = 2;
а pcBlock может быть любым, числовым пока что
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
25.09.2016, 10:29 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;
}
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 6
25.09.2016, 10:39 19
Можешь вставить в нужное место
C++
1
 unsigned char pcBlock[2] = {0xff, 0xff}, len = 2;
в мой код?
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
25.09.2016, 10:41 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;
}
2
25.09.2016, 10:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2016, 10:41
Помогаю со студенческими работами здесь

Попробовать определить алгоритм CRC строки
Доброго всем дня! Реально ли определить? Есть ящик, посылает по 232 строки. Например есть строка...

Алгоритм расчета CRC-XMODEM полином 8408
Добрый день. Нужно вычислить CRC-XMODEM полином 8408 строку: Нашел код на .NET string...

Составить алгоритм-вычисление квадрата суммы двух чисел и алгоритм для вычисления функции
Здравствуйте!Мне нужно все с самого начала и точно,помогите пожалуйста! 1.составить...

Выбрать алгоритм и составить его блок-схему для вычисления значения указанной функции.Составить программу вычисления
Пожалуйста,помогите!!!


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru