![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#121 | ||
Форумчанин
Регистрация: 12.03.2019
Сообщений: 432
|
![]() Цитата:
Код:
Цитата:
Я проделал . как понял в каждом из шага ,переносятся, по 1,2,4 бита что это мне дало не понятно? только запутался окончательно. Последний раз редактировалось BDA; 20.11.2021 в 21:52. |
||
![]() |
![]() |
![]() |
#122 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,428
|
![]()
CRCN правильно изменена, а reverse нет.
Да, число постепенно "крутится". Пример в десятичных числах: 12345678 -> 21436587 -> 43218765 -> 87654321. Решил разделить reverse на 2 случая, чтобы меньше ненужной работы делать: Код:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#123 | ||
Форумчанин
Регистрация: 12.03.2019
Сообщений: 432
|
![]() Цитата:
Получается 2 revers . а одним не получится ? BDA, мне вчера ребята сказали что CRC32, очень редко, где применяется и не ходовая. А вот Checksum 8 -16 это частый алгоритм, в редакторе он есть, как я вчера прочитал, это простое суммирование байт, с разделением при подсчёте по одному байту для 8 и по 2 байта для 16 byte и word. Вчера накатал, считает правильно, но не учтено исключение байта и едит. Вот я подумал, а к CHECKSUM можно тоже функцию написать, чтоб к нашему коду для CRC прикрутить?. Да, это факт чтоб меньше было. Я не знаю о каком втором случае идёт речь, одного reverse вполне достаточно для CRC 8, 15,16,и 32 проверено код : Код:
А какой второй случай? к стате, отличный вариант , я вчера о нём подумал, но зашился и забыл .... Цитата:
Исправил тестовую, на 32 был вывод из двух байт исправил и дополняю тестовым файлом для проверки 32 CRC Последний раз редактировалось BDA; 21.11.2021 в 23:43. |
||
![]() |
![]() |
![]() |
#124 | |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,428
|
![]() Цитата:
Ну функция CRCN вообще получилась крайне неэффективная. И с одним reverse будет работать. Вот только в reverse_byte 13 битовых операций (не смотрел, как там компилятор соптимизировал), а в reverse_longword 23 битовых операции. То есть практически в 2 раза больше. Я, правда, не понял, что за true и false в комментариях к коду.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() Последний раз редактировалось BDA; 21.11.2021 в 03:34. |
|
![]() |
![]() |
![]() |
#125 | |
Форумчанин
Регистрация: 12.03.2019
Сообщений: 432
|
![]()
доложил тестовый файл под 32
Как в редакторах идёт? правильно совмещается, а почему бы и нам не добавить ?, сегодня не нужна, а завтра будет задание, а так, уже готово всё. Для полноты. И интересен сам код, по идеи он должен быть легче CRC и функция проще должна быть. Цитата:
Хотел спросить а почему не делать w := swap(w); когда считываем контрольную сумму прописанную в файле, разве она, не в перевёрнутом виде записывается? Или Вы имели ввиду для crc := swap(crc); подсчитанной? тогда да, верно. Fs.Position := addr3; Fs.Read(w, 2); w := swap(w); // считываем контрольную сумму из файла Мне кажется что только для CRC32 не ставить, там контролка из 4 байт, а для остальных ставить нужно при считывании, или нет ? Это я для себя, я знаю что там нет логический действий, мне для оринтира, когда сдвигал биты на листке, ну и так записывал, не обращайте внимание. Функцию, для Checksum8 -16 Потому что у нас, есть уже код, есть едиты, байты в чексумме тоже надо пропускать, вот хотелось бы и чексумм прикрутить. Вот что пытался сделать написав функцию : Код:
Код:
Что то я в функции на мудрил.... Подскажите BDA пожалуйста! . Последний раз редактировалось BDA; 21.11.2021 в 23:44. |
|
![]() |
![]() |
![]() |
#126 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,428
|
![]()
Ну если как еще одна возможность в программе, то да. Но отдельной функцией (с точки зрения кода).
Действительно ЦПУ знатная молотилка. Если верно померил время, то на строке в 1млн символов разница по времени между функциями CRCN с reverse_byte или с reverse_longword колебалась в районе одного процента. А вот "зеркалирование" алгоритма дало уже 10%, хотя я ожидал большего: Код:
Это зависит не от количества байт, а от того, с каким порядком байт контрольная сумма сохранялась. Ага: Код:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#127 | ||||||
Форумчанин
Регистрация: 12.03.2019
Сообщений: 432
|
![]() Цитата:
Код:
Цитата:
Тоесть нет единого порядка прописи контрольной суммы для всех.. Цитата:
Цитата:
Но а Ваше мнение , какую лучше использовать функцию эту : Код:
Код:
или без разницы? К какому выводу пришли ? Цитата:
16 по два байта подсчитываются, а 32 по 4 байта. С такой функцией делает только Checksum 8, изменение на Word ни чего не даёт. всё ровно Checksum 8 . как то странно с byte считает один байт контрольной суммы. что неправильно. с word, правильно, но Checsum 16 не считает. Цитата:
Код:
Код:
Изменяю переменные, всё бестолку. всё ровно checksum8 выходит. Последний раз редактировалось BDA; 21.11.2021 в 23:45. |
||||||
![]() |
![]() |
![]() |
#128 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,428
|
![]()
Да, но правильнее сказать не контрольной суммы, а любых многобайтовых данных (см. порядок байтов).
Да, получилось без разницы. Лениво смотреть, что там в ассемблере получилось. Ну а в зеркальном алгоритме и так осталось только несколько вызовов reverse и там нужна версия именно для 32битных чисел. Если верно понял, там не подсчет идет по 2 или 4 байта, а просто результат суммирования хранится в 2 или в 4 байтах. По идее, это уже checksum16 получился. Вы там поправьте IntToHex, чтобы выводить 2 байта.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#129 | |
Форумчанин
Регистрация: 12.03.2019
Сообщений: 432
|
![]() Цитата:
function checksum8(P: PChar; Len: byte; skip_i: Integer): byte; на ерунде спотыкаться так стоит и стояло crc :=checksum8(PChar(buffer), buf_len, skip_i - addr1); edit2.Text := IntToHex(crc, 2); С исключение байта 2B неправильно подсчитывает. с редактором расхождение. Последний раз редактировалось sergey.serg-72; 22.11.2021 в 00:50. |
|
![]() |
![]() |
![]() |
#130 | |
Форумчанин
Регистрация: 12.03.2019
Сообщений: 432
|
![]() Цитата:
Вообще фантастика, нет это Checksum 8 выходит а Checksum 16 не получается. Стала срабатывать исключение байта, но всё ровно checksum 8 Код:
Код:
Не пойму в чём трабла? то получалась 16 с этим кодом, теперь только 8, впал в зависание... |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Opendialog завис | DimOn4Ik | Общие вопросы Delphi | 12 | 02.11.2018 16:08 |
Реализация суммы в простом варианте. | Mariolka | PHP | 8 | 10.11.2016 15:50 |
С++ сортировка в текстовом файле. (Задание на курсовик никак не получается) | Evg888 | Помощь студентам | 1 | 02.06.2012 19:37 |
Житейская задачка о простом копировании | mephist | Помощь студентам | 11 | 16.05.2009 20:42 |