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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2021, 21:43   #91
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В CRC16 также цикл "for j := 0 to 7 do".
Да пересмотрел и для CRC8 и для CRC15 и для CRC16 везде 7 , один бит теряется?

Цитата:
Сообщение от BDA Посмотреть сообщение
Нет. Из потока всегда берется 8 бит за один раз. Но разместить их надо всегда в старшие биты result. Поэтому для CRC16 сдвиг "shl 8", а для CRC8 не было сдвига вообще (если рассматривать функции до CRCN).
Осенило !!! из потока всегда берётся 8 бит для всех CRC и 8 и 15 и 16, так как для CRC 8 для функции CRCN сдвиг не нужен. по этому для всех что больше 8 бит делается сдвиг влево. в старшие биты.

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, универсальная (от CRC-1 до CRC-16, но проверял только на нескольких алгоритмах и строке 123456789). Нет, reverse всё также нужна.
Получается так :
Код:
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;
оставляем для всех CRC реверс нужен.

Далее, за место функциий

function CRC16(P: PChar; Len: Word;
function CRC15(P: PChar; Len: Word;
function CRC8(P: PChar; Len: Word;

Одну универсальную для всех эту:
Код:
function CRCN(P: PChar; Len: Word; skip_i: Integer; N, Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word;
var
  i, j: Integer;
begin
  Result := Init shl (16 - N);
  Poly := Poly shl (16 - N);
  for i := 0 to Len - 1 do
  begin
    if i = skip_i then
      Continue;
    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;
  Result := Result shr (16 - N);
  if RefOut then
    Result := reverse(Result) shr (16 - N);
  Result := Result xor XorOut;
end;
а далее так ;

function CRC5MPT1327(P: PChar; Len: Word; skip_: Integer): Word;
begin
Result := CRCN(P, Len, skip_ , $6815, 0, 1, False, False);
end;


function CRC8(P: PChar; Len: Word; skip_: Integer): Word;
begin
Result := CRCN(P, Len, skip_ , $7, 0, 0, False, False);
end;

function CRC115(P: PChar; Len: Word; skip_: Integer): Word;
begin
Result := CRCN(P, Len, skip_ , $4599, 0, 0, False, False);
end;



То есть теперь для всех CRC теперь так, я правильно понял?

Цитата:
Сообщение от BDA Посмотреть сообщение
Еще одно замечание. Я с темой реализации CRC сталкиваюсь впервые (до начала данной темы на форуме не задумывался, как именно оно там считает) и могу ошибаться. Так что единственным мерилом верности выводов является совпадение контрольной суммы с чужими реализациями.
Вот Вы в первые, я тоже, а сколько ещё таких?
А тема, думаю интересная и крайне полезная. И кому то надо начинать.
Мы первые будем !
В остальном надо проверять , согласен , сейчас буду проверять, тестовый файл есть, таблица есть. Сейчас и попробуем.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
по этому для всех что больше 8 бит делается сдвиг влево. в старшие биты.
Да. Но при таком подходе нельзя было обрабатывать длины, меньшие 8.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
оставляем для всех CRC реверс нужен.
Да.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Далее, за место функциий Одну универсальную для всех эту
Да.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
То есть теперь для всех CRC теперь так
Нет. Не хватает значения параметра N при вызове CRCN. Нужно после параметра skip_ еще вписать число width алгоритма.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 17.11.2021, 22:24   #93
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Нет. Не хватает значения параметра N при вызове CRCN. Нужно после параметра skip_ еще вписать число width алгоритма.
Попробовал в тестовой программе универсальную функцию как выше и компилятор сразу в ошибку при компиляции. как я понял ему. не нравится что из WORD в boolean , короче универсальная не подходит пока, что то надо дополнять. или менять.
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 22:37   #94
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Нет. Не хватает значения параметра N при вызове CRCN. Нужно после параметра skip_ еще вписать число width алгоритма.
Д BDA. ВЫ правы! надо добавлять количество бит .

Result := CRCN(P, Len, skip_ ,15,$1021, 0, 0, true, true);
Result := CRCN(P, Len, skip_ ,16,$1021, 0, 0, true, true);
Result := CRCN(P, Len, skip_ ,8,$ 7, 0, 0, false, false);

Ошибка исправлена, остаётся добавить в программу CRC8 и прогнать тестовый файл и сравнить с таблицей контрольную сумму.
Гигантская работа предстоит. но истина дороже, быть первыми обязывает.
Поехали !
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 23:17   #95
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Так что единственным мерилом верности выводов является совпадение контрольной суммы с чужими реализациями.
BDA первые тесты по таблице 16CRC два варианта отлично совпадение с таблицей и с тритоном, CRC15 нет возможности проверить нет в таблице, нет в HxD и тритоне.
CRC8 всё сходится с таблицей контрольная сумма А0 , в нашем коде и в таблице. в HxD вообще нет CRC8 софт тритона выдаёт D7, прога наша А0, таблица А0 , тестовый файл один.
Получается два разных результата, кому верить ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 18.11.2021, 00:33   #96
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

BDA? Вас можно поздравить ! проверено все 23 варианта CRC16, всё отлично, проверены все варианты CRC8 10 штук, всё отлично, всё сходится с таблицей.
Одно только расхождение по CRC8, как писал в HxD нет CRC8, в Тритоне выходит D&, в таблице и у нас A0.
CRC15 не проверено, по нечем, но думаю всё окей должно быть.
Поздравляю Вас !
sergey.serg-72 вне форума Ответить с цитированием
Старый 18.11.2021, 01:31   #97
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Получается два разных результата, кому верить ?
Да что-то Тритону не верю
crccalc выдал A0, HxD выдал A0 (если выбрать из списка алгоритмов "Заданный CRC" и задать настройки для CRC8).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 18.11.2021, 01:35   #98
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да что-то Тритону не верю
crccalc выдал A0, HxD выдал A0 (если выбрать из списка алгоритмов "Заданный CRC" и задать настройки для CRC8).
Да, есть такой момент. вот не понятно кто прав . тритон. или HxD ,crccalc ?
В остальном , всё отлично.
Не нашёл калькулятора-онлайн для CRC15, от слова совсем.
Видимо совсем не популярный алгоритм. инфы по нему 0.
sergey.serg-72 вне форума Ответить с цитированием
Старый 18.11.2021, 01:44   #99
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно пойти разными путями. Или "готовить" входные данные, исключая ненужный байт, или засунуть логику пропуска прямо в функцию подсчета (топорно, зато меньше думать):
Ещё момент нарисовался, сокурсник подсказал сейчас.
Что бывает контрольная сумма, хранится. в середине файла (это как?. я такого не встречал) и при подсчёте . бывает что надо пропустить два байта.
А у нас в программе пропускается только один байт.
Отсюдо вопрос. можно сделать чтоб. когда надо. один байт пропускал. а когда надо. то два байта пропустить.
Вот думаю как и можно ли реализовать это?
Наверное надо в функцию вводить переменную Byt типа Word, далее новый едит, это тоже
понятно.
А вот как организовать в функцию, чтоб когда надо один байт (по старому), а когда надо то два байта. Как то условие новое надо делать?
Вот думаю как этот момент реализовать, помозговал, думаю прав сокурсник, нужно и так и так.

function CRC16(P: PChar; Len, BYT: Word;
skip_ : Integer; Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word; // новая переменная типа word для двух байт



for i := 0 to Len - 1 do
begin
if i = $2C then
continue;


for i := 0 to Len - 1 do
begin
if i = skip_i then
continue;

Последний раз редактировалось sergey.serg-72; 18.11.2021 в 01:47.
sergey.serg-72 вне форума Ответить с цитированием
Старый 18.11.2021, 04:34   #100
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
for i := 0 to Len - 1 do
begin
if i = skip_i then
continue;
Сделал так : function CRCN(P: PChar; Len: Word; skip_i , skip_2 : Integer; N, Poly, Init, XorOut: Word; RefIn, RefOut: Boolean): Word; // добавил в функцию новую переменную skip_2

далее : if i = skip_i then
Continue;
if i = skip_2 then
Continue;


далее :

function CRC16CCITT(P: PChar; Len: Word; skip_i ,skip_2 : Integer): Word;
begin
Result := CRCN(P, Len, skip_i , skip_2 ,16, $1021, $FFFF, 0, False, False);
end;


далее ; procedure TForm1.Button2Click(Sender: TObject);
var
addr1, addr2, addr3,skip_i , skip_2, buf_len: Integer;


далее : skip_i := StrToIntDef('$' + Edit1.Text, -1);

skip_2 := StrToIntDef('$' + Edit2.Text, -1); // новый едит

далее :

crc :=CRC16CCITT(PChar(buffer), buf_len, skip_i - addr1 , skip_2 - addr1 );


Компилируется но результат стал неверным . где то ошибка ?

Последний раз редактировалось sergey.serg-72; 18.11.2021 в 04:38.
sergey.serg-72 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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