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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, их надо дополнить. И добавить еще один шаг по обмену битами. В CRCN тип Len можно было не менять. А вот типы параметров (полинома, начального значения, XorOut) алгоритма надо было менять. 16 на 32 заменить, а 8 на 24.
Нет , наверное не сдюжу, я не до конца с revers, разобрался, откуда в ней берутся данные?

Вот попробовал написать одну функцию,компилируется, считает, выводит, но сумма не та на выходе, опять, что то пропустил, или не учёл ?

Код:
function CRC32(P: PChar; skip_, skip_2 : Integer;Len: Word): longWord;
var
i, j: Integer;
begin
Result :=$FFFFFFFF;
for i := 0 to Len - 1 do

begin
  if i = skip_ then
          Continue;

    if i = skip_2 then


Result := Result xor (ord(P[i]) shl 8);
for j := 0 to 7 do
begin
 if (Result and $80000000) <> 0 then
Result := (Result shl 1) xor $4C11DB7
else
Result := Result shl 1;
end;
end;
end;
crc :=CRC32(PChar(buffer), buf_len, skip_ - addr1 , skip_2 - addr1);
sergey.serg-72 вне форума Ответить с цитированием
Старый 19.11.2021, 05:30   #112
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,428
По умолчанию

Параметры от "CRC-32/MPEG-2", вроде. В коде потеряли один Continue. И нужно "shl 8" на "shl 24" заменить.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
откуда в ней берутся данные?
Переведите маски в двоичное представление. Тогда станет понятнее. На первом шаге меняются местами соседние биты, на втором шаге соседние 2 бита и т.д. На последнем шаге меняются местами половины 16битного числа.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.11.2021 в 05:34.
BDA вне форума Ответить с цитированием
Старый 19.11.2021, 05:48   #113
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Параметры от "CRC-32/MPEG-2", вроде. В коде потеряли один Continue. И нужно "shl 8" на "shl 24" заменить.
"CRC-32/MPEG-2", вроде. нет, самая первая CRC-32/zlib

В коде потеряли один Continue., да точно, добавил.

И нужно "shl 8" на "shl 24" заменить. заменил на 24

Код:
function CRC32(P: PChar; skip_, skip_2 : Integer;Len: Word): longWord;
var
i, j: Integer;
begin
Result :=$FFFFFFFF;
for i := 0 to Len - 1 do

begin
if i = skip_ then
Continue;

if i = skip_2 then
Continue;

Result := Result xor (ord(P[i]) shl 24);
for j := 0 to 7 do
begin
 if (Result and $80000000) <> 0 then
Result := (Result shl 1) xor $4C11DB7
else
Result := Result shl 1;
end;
end;
end;
Результат : компилируется отлично, но после загрузке файла, в ошибку сразу (процесс, типа вызвал исключение и адрес...)
Ругается, на эту строку : Result := Result xor (ord(P[i]) shl 24);
sergey.serg-72 вне форума Ответить с цитированием
Старый 19.11.2021, 05:59   #114
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,428
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
после загрузке файла, в ошибку сразу (процесс, типа вызвал исключение и адрес...)
Перепутали местами аргументы при вызове:
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
function CRC32(P: PChar; skip_, skip_2 : Integer;Len: Word): longWord;
crc :=CRC32(PChar(buffer), buf_len, skip_ - addr1 , skip_2 - addr1);
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
самая первая CRC-32/zlib
В zlib другие значения RefIn, RefOut и XorOut.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.11.2021, 06:13   #115
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Переведите маски в двоичное представление. Тогда станет понятнее. На первом шаге меняются местами соседние биты, на втором шаге соседние 2 бита и т.д. На последнем шаге меняются местами половины 16]битного числа.
Код:
                                 15
 f := ((f shr 1) and $5555) or ((f and $5555) shl 1);  // для 16 байт 
                                14
 f := ((f shr 2) and $3333) or ((f and $3333) shl 2);   // для 15 бит
                                12
 f := ((f shr 4) and $0F0F) or ((f and $0F0F) shl 4);    // для 8 бит

 f := ((f shr 4) and  $? не въехал ) or ((f and $ не въехал?) shl 6);   // для 32 бит


  f := (f shr 8) or (f shl 8);
  f := (f shr 24) or (f shl 24); // понятно
  Result := f;
Ни как не въеду как перевести на 32

Цитата:
Сообщение от BDA Посмотреть сообщение
В zlib другие значения RefIn, RefOut и XorOut.
Как другие ? RefIn true RefOut true XorOut 0xFFFFFFFF

В остальном исправил, но показывает не верно сумму.

Код:
function CRC32(P: PChar; Len: Word; skip_, skip_2 : Integer): longWord;
var
i, j: Integer;
begin
Result :=$FFFFFFFF;
for i := 0 to Len - 1 do

begin
if i = skip_ then
Continue;

if i = skip_2 then
Continue;

Result := Result xor (ord(P[i]) shl 24);
for j := 0 to 7 do
begin
 if (Result and $80000000) <> 0 then
Result := (Result shl 1) xor $4C11DB7
else
Result := Result shl 1;
end;
end;
end;
В чём проблема неверного подсчёта ?, что опять не допонял ?

Цитата:
Сообщение от BDA Посмотреть сообщение
В zlib другие значения RefIn, RefOut и XorOut.
проверил выдаёт правильные значения по CRC-32/MPEG-2 как так. вводил zip а выдаёт от другой?

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

Для RefIn = true и RefOut = true требуется рабочий reverse. "Result := Result xor (ord(P[i]) shl 24);" - это код для RefIn = false. Кода, который переворачивает Result (для RefOut = true) и который выполняет xor c 0xFFFFFFFF, нет, что можно расценивать как RefOut = false и XorOut = 0. Вот и получилось, что параметры на самом деле соответствуют "CRC-32/MPEG-2".
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Ни как не въеду как перевести на 32
Вот функция reverse для байта:
Код:
function reverse(f: Byte): Byte;
begin
  f := ((f shr 1) and $55) or ((f and $55) shl 1);
  f := ((f shr 2) and $33) or ((f and $33) shl 2);
  f := (f shr 4) or (f shl 4);
  Result := f;
end;
Возьмите любое однобайтовое число и проделайте на бумаге вручную эти операции.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.11.2021, 07:38   #117
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Для RefIn = true и RefOut = true требуется рабочий reverse.
без него не обойтись?

Цитата:
Сообщение от BDA Посмотреть сообщение
это код для RefIn = false. Кода, который переворачивает Result (для RefOut = true) и который выполняет xor c 0xFFFFFFFF, нет, что можно расценивать как RefOut = false и XorOut = 0. Вот и получилось, что параметры на самом деле соответствуют "CRC-32/MPEG-2".
то есть ни как не обойтись. без реверса. или я что о в коде не то сделал?
А то я не пойму ни как что надо сделать в коде, без реверса. чтоб 32 зип была?
голова на сегодня уже всё. отказывается работать. перегруз....

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
зачем на бумаге не понял ?, есть же калькулятор.
Потому что калькулятор это не достаточно наглядно. Можете посмотреть статью про битовые операции, затем возьмите листок в клетку, напишите любое 8битное двоичное число, и проделайте хотя бы первую строку кода функции reverse, внимательно следя, куда пошел каждый бит.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
без него не обойтись?
Не обойтись. Ну или просто не трогать алгоритмы с RefIn = true и RefOut = true, пока не почините reverse.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
без реверса. чтоб 32 зип была?
Так не получится. Можете написать свою функцию reverse, которая циклом "собирает" по битам перевернутое число. Будет медленнее, зато, может быть, понятнее.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.11.2021, 23:04   #119
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
function reverse(f: Byte): Byte;
begin
f := ((f shr 1) and $55) or ((f and $55) shl 1);
f := ((f shr 2) and $33) or ((f and $33) shl 2);
f := (f shr 4) or (f shl 4);
Result := f;
end;

Возьмите любое однобайтовое число и проделайте на бумаге вручную эти операции.


Взял листок попробовал, если я не ошибаюсь, то это сдвиг бита в лево на 1 бит, или на 2, или 4 бита согласно функции revers мы в зависимости от логики, сдвигаем бит либо в лево, либо в право и как я понял от этого зависит false, или true лож , или истина. вроде понятно что функция revers это функция логическая, которая определяет когда лож, а когда истина. Очень отличное решение, кто бы спорил. Но всё ровно не понял значений $5555, $3333), $0F0F из чего они берутся и для каких типов CRC?

Цитата:
Сообщение от BDA Посмотреть сообщение
Потому что калькулятор это не достаточно наглядно. Можете посмотреть статью про битовые операции, затем возьмите листок в клетку, напишите любое 8битное двоичное число, и проделайте хотя бы первую строку кода функции reverse, внимательно следя, куда пошел каждый бит.
Статья интересная прочитал, вчера тоже читал, но ясности мне не добавили, проще на пальцах, а то эту науку изучать до второго пришествия придётся..

Цитата:
Сообщение от BDA Посмотреть сообщение
Не обойтись. Ну или просто не трогать алгоритмы с RefIn = true и RefOut = true, пока не почините reverse.
Это как? ну то что писать функцию к каждой CRC32, это понятно, а вот как с моей функцией не трогать алгоритмы, не понял.

Цитата:
Сообщение от BDA Посмотреть сообщение
Так не получится. Можете написать свою функцию reverse, которая циклом "собирает" по битам перевернутое число. Будет медленнее, зато, может быть, понятнее.
Вот и не получаетсясвою написать, иначе бы написал бы.

Безусловно функция revers нужная и универсальная функция и она лучше и нужней.
Просто я недопонимаю значений, откуда, они взяты . То что функция переносит биты в лево и в право , в зависимости от boolean лож, или истина , для этого и написана эта функция, это я понял. Не могу понять значений в скобках и принцип действия, когда вступает CRC16, когда CRC15 и когда CRC8 ?

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
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;
Первая строка f := ((f shr 1) and $5555) or ((f and $5555) shl 1); сдвигает бит в лево, или в право , в зависимости от false, или true бит сдвигается либо в лево, либо в право, это зависит от логики и флага RefIn. или RefOut. Это понятно но откуда взяты значения $5555 ? это 101010101010101 по логике, если сдвинуть бит в право то будет 0 false это понятно но для какой CRC 15,crc16, crc8 ? от чётности битов зависит, или нет ?

вторая строка : f := ((f shr 2) and $3333) or ((f and $3333) shl 2); $3333 - 11001100110011 сдвиг уже на 2 бита либо в лево. либо в право как не сдвигай на выходе 0 false тоже ясно.
Не ясно для какой CRC и для какого количество бит ?

третья строка : f := ((f shr 4) and $0F0F) or ((f and $0F0F) shl 4); 111100001111( куда не сдвигай всегда будет истина true, сдвиг уже по 4 бита понятно, опять не понятно значение $0F0F откуда взята для какой CRC и для скольких бит ?

четвёртая строка : f := (f shr 8) or (f shl 8); здесь понятно что для 1 байта, или 8 бит, в право, или лево, значит строго по 8 бит обработка для всех, это понятно.

Result := f; данные переменной f присваиваем переменной Result это тоже понятно.


вторая

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
revers это функция логическая
Не логическая.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
проще на пальцах
Общий смысл операций уже писал: "На первом шаге меняются местами соседние биты, на втором шаге соседние 2 бита и т.д. На последнем шаге меняются местами половины 16битного числа.".
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
как с моей функцией не трогать алгоритмы, не понял.
Реализовывать только те варианты CRC, в которых RefIn = false и RefOut = false.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Не могу понять значений в скобках и принцип действия, когда вступает CRC16, когда CRC15 и когда CRC8 ?
Не нужно связывать reverse и алгоритмы CRC. reverse просто переворачивает биты в числе, а для чего и как будет использоваться перевернутое число, это не дело reverse. Если не можете разобраться с масками в скобках, то я и предлагаю вам написать reverse по-своему, без магии битовых масок и сдвигов, а просто сделать цикл и в нем по битику собрать число задом наперед.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
это зависит от логики и флага RefIn. или RefOut
Не нужно смотреть на флаги RefIn и RefOut.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
сдвигает бит в лево, или в право
Хоть в коде и есть ИЛИ, но это битовые, а не логические операции. Лучше рассматривайте вариант для Byte, чтобы не выписывать 16битовые числа. Вы наконец перевели маски в двоичное представление. Осталось проделать каждый шаг на бумаге, чтобы увидеть происходящие изменения с числом.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
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