Добрый день.
Подскажите пожалуйста алгоритм расчета контрольной суммы
для ТРМ201.
Например:
Запрос значения со входа:
Адрес 15
23 47 56 48 47 52 49 4с 4e 4d 4f 51 4b 0d
CS = 4d 4f 51 4b Как она получилась?
Добрый день.
Подскажите пожалуйста алгоритм расчета контрольной суммы
для ТРМ201.
Например:
Запрос значения со входа:
Адрес 15
23 47 56 48 47 52 49 4с 4e 4d 4f 51 4b 0d
CS = 4d 4f 51 4b Как она получилась?
это пакет в ascii виде с начальным и конечным маркерами: #GVHGRILNMOQK\xD
после распаковки в двоичный вид получаем 0f 10 b2 57 68 a4, контрольная сумма - 68 a4, рассчитывается по следующему алгоритму:
подробности в описании протокола ОВЕН.Код:unsigned short owenCRC16(unsigned char* packet, size_t length) { size_t i, j; unsigned short crc; assert(packet); crc = 0; for (i = 0; i < length; ++i) { unsigned char b = packet[i]; for (j = 0; j < 8; ++j, b <<= 1) { if ((b ^ (crc >> 8)) & 0x80) { crc <<= 1; crc ^= 0x8F57; } else crc <<= 1; } } return crc; }
Спасибо большое.
Теперь работает!
в дельфи я полный дуб, и вам на него время тратить не советую.
но если вы настаиваете, замените операторы >>, <<, ^, & на shr, shl, xor, and соответственно.
А говорите дуб... http://www.owen.ru/forum/images/icons/icon7.gif
Smile
Спасибо, попробую
Контрольная сумма!
Из приведеннова в форуме примера 23.08.2007, 14:34 помогите разобраться !
#GVHGRILNMOQK\xD после отбрасывания маркеров начала и конца кадра и перевода в двоичный код получилось:
00001111 0001000 10110010 01010111 01101000 10100100
Как считалась контрольная сумма? Объясните подробней с примером типа
00001111 + 0001000 + 10110010 01010111
На «С++» примеры и ссылки на протокол приводить не стоит! лучше на пальцах так понятней![]()
Заранее благодарен!
вы меня извините, но на расчет crc у меня пальцев не хватит. алгоритм на с в этой ветке приведен. если вас интересует математическая основа, ее несложно найти в интернете.
если коротко, число состоящее из всех битов пакета делится на выбранный полином. crc - остаток от деления.
Попоробовал посчитать КС по алгоритму Дмитрия Егоренкова для такого запроса:
GGHIONOKGGGGRVSM получил 2e77, а на самом деле как видите bfc6.
В чем дело?