|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
15.12.2014, 16:52 | #11 |
Регистрация: 15.12.2014
Сообщений: 5
|
Alex11223, спасибо, я пересмотрел уже много ссылок. Но т.к. только начал разбираться в c#, то не понял, как это можно применить для строки типа string, а не для файла?
типа этого: Код:
|
15.12.2014, 17:13 | #12 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Ну для начала надо как-нибудь перевести строку в байты.
Например, так: Код:
Код:
А для чего вам crc32 вообще? Цель какая?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
15.12.2014, 17:30 | #13 |
Регистрация: 15.12.2014
Сообщений: 5
|
Вот так работает, но результаты отличаются от php-шной функции:
Код:
|
15.12.2014, 17:34 | #14 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
21.02.2015, 19:36 | #15 |
Новичок
Джуниор
Регистрация: 21.02.2015
Сообщений: 1
|
По вполне разумным соображением возникла идея создать универсальную программу по расчёту CRC кода для разных полиномов и их порядков. Казалось бы, что тут сложного, математическое описание есть, вполне понятное и достаточно простое. Но реально на это накладывается как аппаратные возможности, так и программные. Так алгоритм, созданный в соответствии с мат описанием практически не даёт того же результата как у других алгоритмов, хотя сам по себе работает правильно и результат имеет правильный и свойства, адекватные свойствам CRC суммы. Одним из наборов исходных параметров, которые могут обобщить алгоритм, является набор, представленный в http://vikipediya.uz.cm/wiki/CRC , например:
Name : CRC 16 Width : 16 Poly : 8005 Init : 0000 RefIn : True RefOut : True XorOut : 0000 Check : BB3D Но описание некоторых из них достаточно неоднозначно (моя фантазия представляет достаточно много вариантов, чтобы их всех перепробовать). Перелопатил много информации, но не смог найти более чёткого описания. А с помощью тех алгоритмов, которые достаточно широко представлены в интернете, мне не удаётся создать общую картину этой проблемы. В чём и прошу помощи. Как минимум хотелось бы более чётко понять, как влияют параметры Init. RefIn, RefOut, XorOut на сам алгоритм, свойства CRC суммы. Возможно любое их сочетание или какие то жёсткие наборы. А как максимум сам обобщённый алгоритм. Может, для этого необходимо ещё вводить параметры. Вот написал и подумал, что эти вопросы под силу для достаточно "крутому" специалисту. Но, может, общими усилиями осилим эту задачу. Последний раз редактировалось Юрий48; 21.02.2015 в 19:40. |
18.03.2015, 23:16 | #16 |
Новичок
Джуниор
Регистрация: 18.03.2015
Сообщений: 2
|
Доброго времени суток формучане. может кому поможет данное сообщение. и есть вопрос к знатокам. я сам в Си не силен, да и не профи!
Вот описание алгоритма для вычисления CRC Modbus Алгоритм генерации CRC: 1. 16-ти битовый регистр загружается числом FF hex (все 1), и используется далее как регистр CRC. 2. Первый байт сообщения складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ с содержимым регистра CRC. Результат помещается в регистр CRC. 3. Регистр CRC сдвигается вправо(в направлении младшего бита) на 1 бит, старший бит заполняется 0. 4. (Если младший бит 0): Повторяется шаг 3 (сдвиг) (Если младший бит 1): Делается операция ИСКЛЮЧАЮЩЕЕ ИЛИ регистра CRC и полиномиального числа A001 hex. 5. Шаги 3 и 4 повторяются восемь раз. 6. Повторяются шаги со 2 по 5 для следующего сообщения. Это повторяется до тех пор пока все байты сообщения не будут обработаны. 7. Финальное содержание регистра CRC и есть контрольная сумма. ПРИМЕР Пример функции на языке C реализующей генерацию CRC приведен ниже. Все возможные величины CRC загружены в два массива. Один массив содержит все 256 возможных комбинаций CRC для старшего байта поля CRC, другой массив содержит данные для младшего байта. Идексация CRC в этом случая обеспечивает быстрое выполнение вычислений новой величины CRC для каждого нового байта из буфера сообщения. Функция принимает два аргумента: unsigned char *puchMsg; /* Указатель на буфер */ unsigned short usDataLen; /* Количество байтов в буфере */ Функция возвращает CRC как тип unsigned short. static unsigned char auchCRCHi[] = { 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80, 0x41,0x01,0xC0,0x80,0x41,0x00, 0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x00,0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x00,0xC1,0x81,0x40,0x01,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x01,0xC0,0x80, 0x41,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x00,0xC1,0x81,0x40,0x01,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x01,0xC0,0x80, 0x22,0x00,0xC1,0x81,0x40,0x00,0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x01,0xC0,0x80,0x41,0x00, 0xC1,0x81,0x40,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x01,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40,0x00, 0xC1,0x81,0x40,0x01,0xC0,0x80, 0x41,0x00,0xC1,0x81,0x40,0x01,0xC0, 0x80,0x41,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x00,0xC1,0x81, 0x40,0x01,0xC0,0x80,0x41,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1, 0x81,0x40,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x01,0xC0,0x80,0x41,0x00,0xC0, 0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81, 0x40,0x00,0xC1,0x81,0x40,0x01, 0xC0,0x80,0x41,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x00,0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41,0x00, 0xC1,0x81,0x40,0x01,0xC0,0x80, 0x41,0x01,0xC0,0x80,0x41,0x00,0xC1, 0x81,0x40 } static char auchCRCLo[] = { 0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02, 0xC2,0xC6,0x06,0x07,0xC7,0x05, 0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD, 0x0F,0xCF,0xCE,0x0E,0x0A,0xCA, 0xCB,0x0B,0xC9,0x09,0x08,0xC8,0xD8, 0x18,0x19,0xD9,0x1B,0xDB,0xDA, 0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D, 0x1C,0xDC,0x14,0xD4,0xD5,0x15, 0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13, 0xD3,0x11,0xD1,0xD0,0x10,0xF0, 0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32, 0x36,0xF6,0xF7,0x37,0xF5,0x35, 0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF, 0x3F,0x3E,0xFE,0xFA,0x3A,0x3B, 0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8, 0xE9,0x29,0xEB,0x2B,0x2A,0xEA, 0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC, 0x2C,0xE4,0x24,0x25,0xE5,0x27, 0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23, 0xE1,0x21,0x20,0xE0,0xA0,0x60, 0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66, 0xA6,0xA7,0x67,0xA5,0x65,0x64, 0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F, 0x6E,0xAE,0xAA,0x6A,0x6B,0xAB, 0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9, 0x79,0xBB,0x7B,0x7A,0xBA,0xBE, 0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C, 0xB4,0x74,0x75,0xB5,0x77,0xB7, 0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1, 0x71,0x70,0xB0,0x50,0x90,0x91, 0x51,0x93,0x53,0x52,0x92,0x96,0x56, 0x57,0x97,0x55,0x95,0x94,0x54, 0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E, 0x5E,0x5A,0x9A,0x9B,0x5B,0x99, 0x59,0x58,0x98,0x88,0x48,0x49,0x89, 0x4B,0x8B,0x8A,0x4A,0x4E,0x8E, 0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,0x44, 0x84,0x85,0x45,0x87,0x47,0x46, 0x86,0x82,0x42,0x43,0x83,0x41,0x81, 0x80,0x40 } unsigned short CRC16(puchMsg, usDataLen) unsigned char *puchMsg; unsigned short usDataLen; { unsigned char uchCRCHi = 0xFF; unsigned char uchCRCLo = 0xFF; while (usDataLen--) { uIndex = uchCRCHi *puchMsg++; uchCRCHi = uchCRCLo auchCRCHi[uIndex]; uchCRCLo = auchCRCLo[uIndex]; } return (uchCRCHi << 8 | uchCRCLo); } --------------------------------------------------------------------------------------- |
18.03.2015, 23:16 | #17 |
Новичок
Джуниор
Регистрация: 18.03.2015
Сообщений: 2
|
А вот пример из другого документа :
CRC Detect Use RTU mode, the message including the method based on the CRC error detection fields. CRC field test the entire contents of the message. The CRC field is two bytes that contains a 16 bit binary value. Calculated by the transmission equipment was added to the message. Receives the message receiving device recalculates the CRC, and with the received CRC value in the field, and if the two values are different, then an error. CRC added to messages, the low byte of the first to join, and then the high byte. CRC simple function as follows: unsigned short CRC16(puchMsg, usDataLen) unsigned char *puchMsg ; /* the message to be CRC checksum */ unsigned short usDataLen ; /* The number of bytes in the message */ { unsigned char uchCRCHi = 0xFF ; /* High CRC byte initialization */ unsigned char uchCRCLo = 0xFF ; /* Low CRC byte initialization */ unsigned uIndex ; /* CRC cycle index */ while (usDataLen--) /* Transmitted message buffer */ { uIndex = uchCRCHi ^ *puchMsgg++ ; /* Calculate the CRC */ uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ; uchCRCLo = auchCRCLo[uIndex] ; } return (uchCRCHi << 8 | uchCRCLo) ; } -------------------------------------------------------------------------------------- вопрос по второму примеру : может ли ктонибудь описать алгоритм (второго примера) в таком виде как он описан в первом примере т.е словесно? |
18.03.2015, 23:21 | #18 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
C# это не С.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
вычисление значения функции и переменных, вычисление площади треугольника, определение расстояния между точками на турбо паскале | _4Alex4_ | Помощь студентам | 2 | 14.12.2011 01:43 |
CRC файла. | maxflint | Win Api | 2 | 04.05.2011 12:09 |
подсчет CRC | Женя_88 | Общие вопросы C/C++ | 2 | 16.11.2010 15:01 |
Подсчет CRC | newcooller | Помощь студентам | 0 | 08.11.2010 15:58 |
CRC ОШИБКА | mikki1130 | Софт | 0 | 26.11.2009 18:42 |