ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
457507 Топик полностью
Adept (27.10.2013 06:51 - 07:35, просмотров: 353) ответил Adept на чего-то никак не въеду в CRC, вроде всё понятно, но правильного значения не получается. Где ошибаюсь?
Поправьте, если что. Правильно ли интерпретирую сей СИ-код ???  /* Name : CRC-16 CCITT Poly : 0x1021 x^16 + x^12 + x^5 + 1 Init : 0xFFFF Revert: false XorOut: 0x0000 Check : 0x29B1 ("123456789") MaxLen: 4095 байт (32767 бит) - обнаружение одинарных, двойных, тройных и всех нечетных ошибок */ unsigned short Crc16(unsigned char *pcBlock, unsigned short len) { unsigned short crc = 0xFFFF; unsigned char i; while (len--) { crc ^= *pcBlock++ << 8; for (i = 0; i < 8; i++) crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1; } return crc; } "CRC16" - Массив беззнаковых 16-битных значений с байтовым указателем "*pcBlock" и длиной до 65536 значений (беззнаковая 16-битная переменная "len") "crc" - 16-битная беззнаковая переменная, с начальным присваиванием 0xFFFF "i" - байтовая переменная крутим цикл "while", такое количество раз, сколько данных во входном векторе (переменная "len") { считываем текущий байт из входного вектора, инкрементируем указатель массива и формируем из считанного байта данных %%, 16-битное число 0x%%00, "XORим" это число с текущим значением "crc" (при этом у нас изменился только старший байт crc, т.к младщий байт числа 0x%%00 был "нулевым") начинаем сдвигать в цикле "for" 16-битный регистр "crc", влево, пока не сдвинем его на 1 байт (8бит), при этом: если старший (16-й) бит регистра "crc" = 1, то сдвигаем crc регистр влево на 1 бит и XORим его с полиномом (0x1021), если же старший бит = "0", то ограничиваемся только сдвигом (без XORа) (продолжаем сдвигать влево по вышеуказанному правилу, пока не вдвинем весь байт (8 итераций)) продожаем крутить цикл "while", такое количество раз, сколько данных во входном векторе (переменная "len") когда переберём все входные данные, тозавершаем всю процедуру } чушь какая-то, с XORом текущего значения CRC и приведённого к странному 16-битному числу байта данных. crc ^= *pcBlock++ << 8; По теории вроде как так не нужно делать, а нужно задвигать байт данных в crc регистр справа. что, где упустил ???
...делать нужно так, как нужно. А как ненужно - делать не нужно (С) Винни-Пух :)