Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2021, 02:51   #41
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
значит +1 это уже перескок на один адрес вперёд
Это не перескок. Например, вы прочли в книге 2ю и 3ю страницу. А всего прочли 2 страницы (3 - 2 + 1). На адресе 5E в файле начинается уже контрольная сумма, а не сами данные для расчета.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
если не ввёл значит чтоб считал полностью. без исключения
Можно изменить только "skip_ := StrToIntDef('$' + Edit1.Text, -1);".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.11.2021, 02:56   #42
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Это не перескок. Например, вы прочли в книге 2ю и 3ю страницу. А всего прочли 2 страницы (3 - 2 + 1). На адресе 5E в файле начинается уже контрольная сумма, а не сами данные для расчета.
Ну . если оставить +1. то неправильно считает. или оставить +1. тогда результат неверный. Как быть ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.11.2021, 03:04   #43
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Как быть ?
Просто конечный адрес 5D, а не 5E.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.11.2021, 03:04   #44
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно изменить только "skip_ := StrToIntDef('$' + Edit1.Text, -1);".
В процедуре. за место skip_ := Strtoint('$' + Edit1.Text); . если да. то при пустом едите результат неверный.

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
В процедуре. за место skip_ := Strtoint('$' + Edit1.Text); . если да. то при пустом едите результат неверный.
да. в процедуре изменил и всё отлично стало.

Цитата:
Сообщение от BDA Посмотреть сообщение
Просто конечный адрес 5D, а не 5E.
да . это так. но если оставить +1 то результат неверный выходит. редактор не даст соврать.
Как быть?

Цитата:
Сообщение от BDA Посмотреть сообщение
Просто конечный адрес 5D, а не 5E.
Ясно одно. если оставить так: buf_len := addr2 - addr1+1; то результат неверно подсчитывается.
если так buf_len := addr2 - addr1; то результат правильный

Можно так : buf_len := addr2 - addr1+0; тоже результат правильный можно его. как нейтральный.

Последний раз редактировалось BDA; 14.11.2021 в 04:20.
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.11.2021, 03:35   #45
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Так вы попробовали в первый эдит 2B, в третий эдит 0, а в шестой эдит 5D вместе с "buf_len := addr2 - addr1 +1;"?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.11.2021, 03:43   #46
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Так вы попробовали в первый эдит 2B, в третий эдит 0, а в шестой эдит 5D вместе с "buf_len := addr2 - addr1 +1;"?
да. BDA, Вы как всегда правы ! это самое оно!

На этом варианте и остановимся. огромное Вам спасибо за помощь . это бесценные уроки что Вы даёте. препод всё же не умеет до всех донести наглядно и понятно.
Огромное ещё раз спасибо !!!
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.11.2021, 20:02   #47
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

BDA, я сейчас таблицу изучаю, на которую Вы, дали ссылку :
https://ru.wikipedia.org/wiki/Циклич...0%BE%D0%B2_CRC
У меня вопрос по таблице, если Вас не затруднит.

Между CRC16CCIT и CRC16XMODEM как мы знаем разница в Result := 0; или Result := $FFFF;
разница в Result, из таблицы следует определяет init, Poly =0x1021 у обоих одинаковыый. как я понимаю отвечает за это. строка Result := (Result shl 1) xor $1021
в связи с чем вопрос 1) Как я подсчитал CRC16 насчитывает 21 исполнение. ?
2) можно ли использовать нашу функцию для каждого варианта, естественно с изменениями?
3)Или для каждой надо свлю функцию писать?

2) в чём разница между скажем CRC16CCITT и CRC-16/ARC. или CRC-16/CDMA2000 ?

Как я понимаю надо изменять в функции Result := (Result shl 1) xor $1021 на Result := (Result shl 1) xor $1021C867 ?
Если Вам не трудно объясните на примере пожалуйста, а то для меня это новое, изучаю, но ещё не до конца понял различия и реализации.
Спасибо !

Цитата:
Сообщение от BDA Посмотреть сообщение
Вбил ваш bin на сайте https://crccalc.com/. Контрольную сумму 0x92BE выдал CRC-16/XMODEM, который отличается от CCITT начальным значением.
Если я правильно разобрался в таблице то должно быть так :
Код:
 function CRC-16/ARC(P: PChar; Len: Word; skip_i: Integer): Word;
var
i, j: Integer;
begin
Result :=$0;
for i := 0 to Len - 1 do
begin
if i = skip_i then
continue;
Result := Result xor (ord(P[i]) shl 8);
for j := 0 to 7 do
begin
if (Result and $8000) <> 0 then
Result := (Result shl 1) xor $8005  
else
Result := Result shl 1;
end;
end;
end;
Это функция для CRC-16/ARC ?


А вот это функция для CRC-16/CCITT

Код:
 function CRC16CCITT(P: PChar; Len: Word; skip_i: Integer): Word;
var
i, j: Integer;
begin
Result :=$FFFF;
for i := 0 to Len - 1 do
begin
if i = skip_i then
continue;
Result := Result xor (ord(P[i]) shl 8);
for j := 0 to 7 do
begin
if (Result and $8000) <> 0 then
Result := (Result shl 1) xor $1021
else
Result := Result shl 1;
end;
end;
end;
Если я не ошибаюсь. или я что то не понял ?

Последний раз редактировалось BDA; 19.11.2021 в 18:49.
sergey.serg-72 вне форума Ответить с цитированием
Старый 15.11.2021, 01:18   #48
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
1) Как я подсчитал CRC16 насчитывает 21 исполнение. ?
В таблице 23 алгоритма CRC16 (CRC-A тоже имеет степень 16). И это не исполнение - из всего множества наборов параметров, нескольким наборам дали свои имена. Исходя из заданных этой методикой параметров, всего алгоритмов степени 16 может быть 2 в 50 степени.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
2) можно ли использовать нашу функцию для каждого варианта, естественно с изменениями?
В принципе да.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
3)Или для каждой надо свлю функцию писать?
Если не гнаться за производительностью, то добавив дополнительные проверки, можно поддерживать любой вариант.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Это функция для CRC-16/ARC ?
Не всё так просто. CCITT от CDMA2000 отличался только параметрами Init и Poly (которые вы меняете в двух строках кода). Но ARC отличается от CCITT еще и параметрами RefIn и RefOut, которые тоже нужно как-то учесть при подсчете. Чтобы самому проверить правильность реализации алгоритма, просто считайте контрольную сумму строки "123456789" и сравнивайте со столбцом Check в таблице на Википедии.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.11.2021, 03:31   #49
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В таблице 23 алгоритма CRC16 (CRC-A тоже имеет степень 16). И это не исполнение - из всего множества наборов параметров, нескольким наборам дали свои имена. Исходя из заданных этой методикой параметров, всего алгоритмов степени 16 может быть 2 в 50 степени.
Значит я неправильно понял, в корне неправильно , а примеров там нет к сожалению.
А тоя смотрю что названия разные, а сумму сходится и подумал, а зачем дублировать, одно и тоже и при этом давать разные названия? Значит выложенные мной функции, в корне не правильны. Значит не усвоил урок.

Цитата:
Сообщение от BDA Посмотреть сообщение
В принципе да.
Вот универсальный вариант и хотел реализовать по таблице, но оказывается что я не неправильно понял. А уже размечтался что удивлю препода универсальной...
Разлетелся Икар..

Цитата:
Сообщение от BDA Посмотреть сообщение
Если не гнаться за производительностью, то добавив дополнительные проверки, можно поддерживать любой вариант.
Производительность не нужна, а вот этот момент: ( то добавив дополнительные проверки, можно поддерживать любой вариант.[/QUOTE]
) А можно на примере, если не затруднит Вас ? Это был бы интересный момент ,сделать универсальную на все 23 варианта. А то я то разлетелся, думал удивлю, но пролетел как фанера, над Парижем....
Жалко что кроме таблице не дают наглядных примеров как , где и что дополнять и изменять.

Последний раз редактировалось BDA; 15.11.2021 в 07:04.
sergey.serg-72 вне форума Ответить с цитированием
Старый 15.11.2021, 07:03   #50
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
а примеров там нет к сожалению.
Кстати говоря, в статье на Википедии на немецком есть примеры на паскале (статья).
Для лучшего понимания прочтите статью Элементарное руководство по CRC-алгоритмам обнаружения ошибок. Бегло ее просмотрел - достаточно познавательно. Я немного "загнул" с оценкой общего количества вариантов, так как не любой полином одинаково полезен. Крайне неэффективный подход с переворотом каждого байта, но совпал со столбцом Check:
Код:
function reverse(f: Word): Word;
begin
  f := ((f shr 1) and $5555) or ((f and $5555) shl 1);
  f := ((f shr 2) and $3333) or ((f and $3333) shl 2);
  f := ((f shr 4) and $0F0F) or ((f and $0F0F) shl 4);
  f := (f shr 8) or (f shl 8);
  Result := f;
end;

function CRC16(P: PChar; Len, Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
  i, j: Integer;
begin
  Result := Init;
  for i := 0 to Len - 1 do
  begin
    if RefIn then
      Result := Result xor reverse(ord(P[i]))
    else
      Result := Result xor (ord(P[i]) shl 8);
    for j := 0 to 7 do
    begin
      if (Result and $8000) <> 0 then
        Result := (Result shl 1) xor Poly
      else
        Result := Result shl 1;
    end;
  end;
  if RefOut then
    Result := reverse(Result);
  Result := Result xor XorOut;
end;

function CRC16CCITT(P: PChar; Len: Word): Word;
begin
  Result := CRC16(P, Len, $1021, $FFFF, 0, False, False);
end;

function CRC16ARC(P: PChar; Len: Word): Word;
begin
  Result := CRC16(P, Len, $8005, 0, 0, True, True);
end;

function CRC16USB(P: PChar; Len: Word): Word;
begin
  Result := CRC16(P, Len, $8005, $FFFF, $FFFF, True, True);
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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