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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Все-таки стоит сравнивать CRC8 и CRC15 из моих сообщений, а не из ваших
Цикл по j не нужно было менять. А сдвиги зависят не от четности/нечетности, а от требуемой длины.
Так я и сравнивал с вашим CRC15,а CRC8 у Вас примера не было, с чем сравнивать ?
Сдвиги зависят от длины, вот я и хочу разобраться, от чего зависит разная длина и какая она должна быть на 8,10,12,14 CRC, как её вычислять ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 05:56   #82
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
CRC8 у Вас примера не было
Был, сразу после вашего сообщения с CRC8.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
от чего зависит разная длина и какая она должна быть на 8,10,12,14 CRC
Так длина дана в таблице (столбец Width). И это число является степенью порождающего контрольную сумму многочлена. А вот необходимые сдвиги уже зависят от длины.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.11.2021, 06:14   #83
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Был, сразу после вашего сообщения с CRC8.
ПРОШУ ПРОЩЕНИЯ BDA, ВЫ ПРАВЫ !, зашился я, мой косяк.
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 06:24   #84
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Хотя, похоже, можно не мучиться со смещениями внутри цикла, а сделать необходимые смещения до и после него:
Код:
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;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.11.2021, 06:25   #85
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Так длина дана в таблице (столбец Width). И это число является степенью порождающего контрольную сумму многочлена. А вот необходимые сдвиги уже зависят от длины.
(столбец Width). для CRC 8 длина 8. для 10 десятая . для 12, двенадцатая. из таблице понятно и наглядна длина.С этим понятно.
далее, является степенью порождающего контрольную сумму многочлена. то есть контрольная сумма в один бай. или в два?
Сдвиги от длины.......CRC8 длина.8. контролка один байт =9 байт

Сдвиги есть в лево. в право так ведь? shl, shr

Цитата:
Сообщение от BDA Посмотреть сообщение
Хотя, похоже, можно не мучиться со смещениями внутри цикла, а сделать необходимые смещения до и после него:
лучше пока помучатся внутри цикла.пока не разобрался и не врубился. от простого. к сложному.

Цитата:
Сообщение от BDA Посмотреть сообщение
Все-таки стоит сравнивать CRC8 и CRC15 из моих сообщений, а не из ваших
Цикл по j не нужно было менять. А сдвиги зависят не от четности/нечетности, а от требуемой длины.

Вот сравнил и вот отличия :

Result := Result xor (ord(P[i]) shl 7); сдвиг в лево для 15




Result := Result xor (reverse(ord(P[i])) shr 8) логический сдвиг вправо 8

Но не как не дойду бестолковкой. сдвиг в право на 8 в одном. во втором сдвиг влево на 7. почему?

Цитата:
Сообщение от BDA Посмотреть сообщение
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;

Это универсальная функция для всех CRC. заместо reverse ?

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
то есть контрольная сумма в один бай. или в два?
Длина контрольной суммы в битах совпадает с Width.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Сдвиги есть в лево. в право так ведь? shl, shr
Да.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
от простого. к сложному.
Не могу сказать, что внутри цикла - просто, а снаружи - сложно.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Вот сравнил и вот отличия
Вы сравниваете разные ветки выполнения по флагу RefIn в двух функциях, а не одну ветку. Чтобы не сравнивать самому построчно, воспользуйтесь, например, программой Meld, которая подсветит различия. Основной смысл сдвигов внутри цикла, это расценивать переменную result как width-битовое число, а новые биты из потока данных надо класть в самые старшие биты result.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Это универсальная функция для всех CRC. заместо reverse ?
Да, универсальная (от CRC-1 до CRC-16, но проверял только на нескольких алгоритмах и строке 123456789). Нет, reverse всё также нужна.

Еще одно замечание. Я с темой реализации CRC сталкиваюсь впервые (до начала данной темы на форуме не задумывался, как именно оно там считает) и могу ошибаться. Так что единственным мерилом верности выводов является совпадение контрольной суммы с чужими реализациями.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.11.2021 в 20:25.
BDA вне форума Ответить с цитированием
Старый 17.11.2021, 21:03   #87
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Длина контрольной суммы в битах совпадает с Width.
BDA здравствуйте ! сегодня препод офигел слегка от старого кода и от того. на сколько я продвинулся. сказал что у репетитора вашего знаний больше чем у него самого. Но хоть честно признался сегодня. что объяснять не умеет ... По принципу провёл урок и всё. дальше сами..
Лёд тронулся. я об этом второй год преподу говорю. что донести и объяснять не умеет совсем. от того и группа в отстающих и интереса нет у ребят к данному предмету. Сегодня, наконец услышал нас....... BDA . Вы пока, не оставляйте тему. пока не разберусь до конца. Что то меня зацепило конкретно.....

И так продолжим ! по теме : (Длина контрольной суммы в битах совпадает с Width.)

берём пример CRC8 - - Width (длина) контрольная сумма 0xF4 1-байт - 8 бит С этим понятно

значит длина для CRC8 это 8 бит Result := Result xor (reverse(ord(P[i])) shr 8)

тогда почему в цикле for j := 0 to 7 do семь почему?

для CRC16 for j := 0 to 8 do

Цитата:
Сообщение от BDA Посмотреть сообщение
Не могу сказать, что внутри цикла - просто, а снаружи - сложно.
Сейчас посмотрел и мне кажется Вы правы.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
значит длина для CRC8 это 8 бит Result := Result xor (reverse(ord(P[i])) shr 8)
Зря вы пытаетесь разобраться с ветки, в которой есть reverse. reverse накладывает свои особенности на размер сдвига (потому что переворачивает 8битное число как 16битное, что нужно учесть при сдвиге).
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
для CRC16 for j := 0 to 8 do
В CRC16 также цикл "for j := 0 to 7 do".
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
семь почему?
Потому что берется один байт (8 бит) из потока и прокручивается через XOR.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.11.2021, 21:28   #89
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы сравниваете разные ветки выполнения по флагу RefIn в двух функциях, а не одну ветку. Чтобы не сравнивать самому построчно, воспользуйтесь, например, программой Meld, которая подсветит различия. Основной смысл сдвигов внутри цикла, это расценивать переменную result как width-битовое число, а новые биты из потока данных надо класть в самые старшие биты result.
Как говорил герой фильма " Покровские ворота " во формулирует !!! Попробую перевести сам.а Вы поправьте. если ошибусь.

( Основной смысл сдвигов внутри цикла, это расценивать переменную result как width-битовое число, а новые биты из потока данных надо класть в самые старшие биты result.)

переменная result для CRC8 - 8 ,бит,для СRС16 - 16 бит так?
А новые биты из потока данных могут быть как 8. так и 16 бит мы кладём в самые старшие биты result - не понятно. ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.11.2021, 21:35   #90
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
переменная result для CRC8 - 8 ,бит,для СRС16 - 16 бит так?
Да.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А новые биты из потока данных могут быть как 8. так и 16 бит
Нет. Из потока всегда берется 8 бит за один раз. Но разместить их надо всегда в старшие биты result. Поэтому для CRC16 сдвиг "shl 8", а для CRC8 не было сдвига вообще (если рассматривать функции до CRCN).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
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