[an error occurred while processing this directive]
|
Вот код который дал SM
typedef unsigned char UCHAR;
typedef unsigned int WORD;
WORD CRC( UCHAR byte, WORD crc)
{
register UCHAR carry, s0_7, s8_15;
carry = (crc >> 8) ^ byte;
carry = carry ^ (carry >> 4);
s8_15 = crc ^ (carry << 4) ^ (carry >> 3);
s0_7 = carry ^ (carry << 5);
return (s8_15 << 8) ^ (s0_7 & 0xff);
}
Не понятно как инициализировать алгоритм значением 0xFFFF
Если предварительно делать CRC=0xFFFF, не получается.
Вот решение в лоб для одного байта 0x0, инициализация 0xFFFF, полином 0x1021
1111111111111111000000000000000000000000
10001000000100001 .
----------------- .
11101111110111110 .
10001000000100001 .
----------------- .
11001111100111110 .
10001000000100001 .
----------------- .
10001111000111110 .
10001000000100001 .
----------------- .
00001110000111110 .
00000000000000000 .
----------------- .
00011100001111100 .
00000000000000000 .
----------------- .
00111000011111000 .
00000000000000000 .
----------------- .
01110000111110000 .
00000000000000000 .
----------------- .
11100001111100000 .
10001000000100001 .
----------------- .
11010011110000010 .
10001000000100001 .
----------------- .
10110111101000110 .
10001000000100001 .
----------------- .
01111111011001110 .
00000000000000000 .
----------------- .
11111110110011100 .
10001000000100001 .
----------------- .
11101101101111010 .
10001000000100001 .
----------------- .
11001011010110110 .
10001000000100001 .
----------------- .
10000110100101110 .
10001000000100001 .
----------------- .
00011101000011110 .
00000000000000000 .
----------------- .
00111010000111100 .
00000000000000000 .
----------------- .
01110100001111000 .
00000000000000000 .
----------------- .
11101000011110000 .
10001000000100001 .
----------------- .
11000000110100010 .
10001000000100001 .
----------------- .
10010001100000110 .
10001000000100001 .
----------------- .
00110011001001110.
00000000000000000.
-----------------.
0110011001001110. CRC=664E
По коду инициализируем CRC=0xFFFF
carry=0xF0
s8_15=0xE1
S0_7=0xF0
CRC=0xE1F0
Кроме того из записи в столбик хоть убей непонятно что с чем перексорить надо. При записи в столбик на каком сдвиге кросится с полиномом зависит от конкретных данных, может всетаки поясните как вычислить CRC не двигая по одному биту а за несколько сдвигов как в программе.