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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Не нужно связывать reverse и алгоритмы CRC. reverse просто переворачивает биты в числе, а для чего и как будет использоваться перевернутое число, это не дело reverse. Если не можете разобраться с масками в скобках, то я и предлагаю вам написать 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 6) and $55555555) or ((f and $55555555) shl 6);
  f := (f shr 8) or (f shl 8);

  Result := f;
end;

/////////////////////////////////////////////////////////

function CRCN(P: PChar; Len: Word; skip_i,skip_2: Integer; N, Poly, Init, XorOut: longWord; RefIn, RefOut: Boolean): longWord;
var
  i, j : Integer;
begin
  Result := Init shl (32 - N);
  Poly := Poly shl (32 - N);
  for i := 0 to Len - 1 do

begin
if i = skip_i then
Continue;
if i = skip_2 then
Continue;

if RefIn then
Result := Result xor reverse(ord(P[i]))
else
 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 Poly
 else
 Result := Result shl 1;
 end;
  end;
 Result := Result shr (32 - N);
 if RefOut then
 Result := reverse(Result) shr (32 - N);
 Result := Result xor XorOut;
end;




 function CRC32(P:  PChar; Len: Word; skip_i, skip_2 : Integer): LongWord;
begin
  Result := CRCN(P, Len, skip_i , skip_2, 32,  $4C11DB7, $FFFFFFFF, $FFFFFFFF, true, true);
end;
компилируется хорошо. но вот выводит данные совсем не те. не могу разобраться в чём причина и всё тут, я с переводом этих бит на листке. последние мозги оставил и запутался.....

Цитата:
Сообщение от BDA Посмотреть сообщение
Реализовывать только те варианты CRC, в которых RefIn = false и RefOut = false.
C этим я уже разобрался . но это плохой вариант только. для CRC, у которых RefIn = false и RefOut = false. а у которых true не подойдёт. Плохой вариант.

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы наконец перевели маски в двоичное представление. Осталось проделать каждый шаг на бумаге, чтобы увидеть происходящие изменения с числом.
Я проделал . как понял в каждом из шага ,переносятся, по 1,2,4 бита что это мне дало не понятно? только запутался окончательно.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
сделал так
CRCN правильно изменена, а reverse нет.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
переносятся, по 1,2,4 бита
Да, число постепенно "крутится". Пример в десятичных числах: 12345678 -> 21436587 -> 43218765 -> 87654321.

Решил разделить reverse на 2 случая, чтобы меньше ненужной работы делать:
Код:
function reverse_byte(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);
  Result := (f shr 4) or (f shl 4);
end;

function reverse_longword(f: LongWord): LongWord;
begin
  f := ((f shr 1) and $55555555) or ((f and $55555555) shl 1);
  f := ((f shr 2) and $33333333) or ((f and $33333333) shl 2);
  f := ((f shr 4) and $0F0F0F0F) or ((f and $0F0F0F0F) shl 4);
  f := ((f shr 8) and $00FF00FF) or ((f and $00FF00FF) shl 8);
  Result := (f shr 16) or (f shl 16);
end;

function CRCN(P: PChar; Len: Word; skip_i1, skip_i2: Integer; N: Byte; Poly, Init, XorOut: LongWord; RefIn, RefOut: Boolean): LongWord;
var
  i, j: Integer;
begin
  Result := Init shl (32 - N);
  Poly := Poly shl (32 - N);
  for i := 0 to Len - 1 do
  begin
    if (i = skip_i1) or (i = skip_i2) then
      Continue;
    if RefIn then
      Result := Result xor (reverse_byte(ord(P[i])) shl 24)
    else
      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 Poly
      else
        Result := Result shl 1;
    end;
  end;
  Result := Result shr (32 - N);
  if RefOut then
    Result := reverse_longword(Result) shr (32 - N);
  Result := Result xor XorOut;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 20.11.2021, 22:26   #123
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, число постепенно "крутится". Пример в десятичных числах: 12345678 -> 21436587 -> 43218765 -> 87654321.
да это я понял сразу, в этом проблемы нет.

Цитата:
Сообщение от BDA Посмотреть сообщение
Решил разделить reverse на 2 случая, чтобы меньше ненужной работы делать:
Получается 2 revers . а одним не получится ?

BDA, мне вчера ребята сказали что CRC32, очень редко, где применяется и не ходовая.

А вот Checksum 8 -16 это частый алгоритм, в редакторе он есть, как я вчера прочитал, это простое суммирование байт, с разделением при подсчёте по одному байту для 8 и по 2 байта для 16 byte и word.
Вчера накатал, считает правильно, но не учтено исключение байта и едит.
Вот я подумал, а к CHECKSUM можно тоже функцию написать, чтоб к нашему коду для CRC прикрутить?.

Цитата:
Сообщение от BDA Посмотреть сообщение
Решил разделить reverse на 2 случая, чтобы меньше ненужной работы делать:
Да, это факт чтоб меньше было. Я не знаю о каком втором случае идёт речь, одного reverse вполне достаточно для CRC 8, 15,16,и 32 проверено код :
Код:
function reverse_longword(f: LongWord): LongWord;
begin
  f := ((f shr 1) and $55555555) or ((f and $55555555) shl 1);
  f := ((f shr 2) and $33333333) or ((f and $33333333) shl 2);
  f := ((f shr 4) and $0F0F0F0F) or ((f and $0F0F0F0F) shl 4);
  f := ((f shr 8) and $00FF00FF) or ((f and $00FF00FF) shl 8);
  Result := (f shr 16) or (f shl 16);
end;

/////////////////////////////////////////////////////////

function CRCN(P: PChar; Len: Word; skip_i, skip_2: Integer; N: Byte; Poly, Init, XorOut: LongWord; RefIn, RefOut: Boolean): LongWord;
var
i, j : Integer;
begin
 Result := Init shl (32 - N);
Poly := Poly shl (32 - N);
for i := 0 to Len - 1 do
 begin
 if i = skip_i then
  Continue;
if i = skip_2 then
Continue;
if RefIn then
Result := Result xor reverse_longword(ord(P[i]))
else
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 Poly
else
Result := Result shl 1;
end;
 end;
 Result := Result shr (32 - N);
 if RefOut then
 Result := reverse_longword(Result) shr (32 - N);
 Result := Result xor XorOut;
end;

////////////////////////////////////////////////////////////

function CRC32zlib(P:PChar; Len: Word; skip_i,skip_2: Integer):longWord;
begin
  Result := CRCN(P, Len, skip_ ,skip_2,32, $4C11DB7, $FFFFFFFF, $FFFFFFFF, true,  true);
end;
////////////////////////////////////////////////////////////

function CRC32BZIP2(P:PChar; Len: Word; skip_i,skip_2: Integer):longWord;
begin
  Result := CRCN(P, Len, skip_ ,skip_2,32, $4C11DB7, $FFFFFFFF, $FFFFFFFF, false,  false);
end;

///////////////////////////////////////////////////////////

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

 /////////////////////////////////////////////////////////

function CRC8(P:PChar; Len: Word; skip_i,skip_2: Integer): Word;
begin
  Result := CRCN(P, Len, skip_i,skip_2 ,8,$7, 0, 0, false,  false);
end;
///////////////////////////////////////////////////////

 function CRC15MPT1327(P: PChar; Len: Word; skip_i,skip_2: Integer): Word;
begin
  Result := CRCN(P, Len, skip_ ,skip_2,15,  $6815, 0, 1, False, False);
end;
Всё работает отлично и без второго реверса.
А какой второй случай?

Цитата:
Сообщение от BDA Посмотреть сообщение
if (i = skip_i1) or (i = skip_i2) then
Continue;
к стате, отличный вариант , я вчера о нём подумал, но зашился и забыл ....

Цитата:
Сообщение от BDA Посмотреть сообщение
function reverse_longword(f: LongWord): LongWord;
begin
f := ((f shr 1) and $55555555) or ((f and $55555555) shl 1); // 31 бит на 1 бит false
f := ((f shr 2) and $33333333) or ((f and $33333333) shl 2); // 30 бит на 2 бита false
f := ((f shr 4) and $0F0F0F0F) or ((f and $0F0F0F0F) shl 4); // 28 бит на 4 бита false
f := ((f shr 8) and $00FF00FF) or ((f and $00FF00FF) shl 8); // 24 бит на 6 бит true
Result := (f shr 16) or (f shl 16); // всегда на 16 бит (2 байта сдвиг) всегда true
end;
Вот теперь понятно всё и второго revers не надо.

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Вот теперь понятно всё и второго revers не надо.
Исправил тестовую, на 32 был вывод из двух байт исправил и дополняю тестовым файлом для проверки 32 CRC
Вложения
Тип файла: rar CRC+TEST_.rar (177.7 Кб, 1 просмотров)
Тип файла: rar CMP_v2_20.rar (249.1 Кб, 1 просмотров)

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
а к CHECKSUM можно тоже функцию написать, чтоб к нашему коду для CRC прикрутить?
Как отдельную функцию, да. А зачем с CRC совмещать?
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
одного reverse вполне достаточно
Ну функция CRCN вообще получилась крайне неэффективная. И с одним reverse будет работать. Вот только в reverse_byte 13 битовых операций (не смотрел, как там компилятор соптимизировал), а в reverse_longword 23 битовых операции. То есть практически в 2 раза больше.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Вот теперь понятно всё и второго revers не надо.
Я, правда, не понял, что за true и false в комментариях к коду.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

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

доложил тестовый файл под 32

Цитата:
Сообщение от BDA Посмотреть сообщение
Как отдельную функцию, да. А зачем с CRC совмещать?
Как в редакторах идёт? правильно совмещается, а почему бы и нам не добавить ?, сегодня не нужна, а завтра будет задание, а так, уже готово всё. Для полноты. И интересен сам код, по идеи он должен быть легче CRC и функция проще должна быть.

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну функция CRCN вообще получилась крайне неэффективная. И с одним reverse будет работать. Вот только в reverse_byte 13 битовых операций (не смотрел, как там компилятор соптимизировал), а в reverse_longword 23 битовых операции. То есть практически в 2 раза больше.
Да вроде всё отлично скомпилировалось, работает быстро и корректно. reverse_byte 13 битовых операций а в reverse_longword 23 битовых операции это да, но на процесс не влияет, почему не эффективно?

Цитата:
Сообщение от BDA Посмотреть сообщение
и не делайте "crc := swap(crc);"
Хотел спросить а почему не делать w := swap(w); когда считываем контрольную сумму прописанную в файле, разве она, не в перевёрнутом виде записывается?
Или Вы имели ввиду для crc := swap(crc); подсчитанной? тогда да, верно.



Fs.Position := addr3;
Fs.Read(w, 2);
w := swap(w); // считываем контрольную сумму из файла


Мне кажется что только для CRC32 не ставить, там контролка из 4 байт, а для остальных ставить нужно при считывании, или нет ?

Цитата:
Сообщение от BDA Посмотреть сообщение
,я правда, не понял, что за true и false в комментариях к коду.
Это я для себя, я знаю что там нет логический действий, мне для оринтира, когда сдвигал биты на листке, ну и так записывал, не обращайте внимание.

Цитата:
Сообщение от BDA Посмотреть сообщение
Как отдельную функцию, да. А зачем с CRC совмещать?
Функцию, для Checksum8 -16
Потому что у нас, есть уже код, есть едиты, байты в чексумме тоже надо пропускать, вот хотелось бы и чексумм прикрутить.
Вот что пытался сделать написав функцию :

Код:
//////////////////////Checlsum8//////////////////////////

function checksum8(P: PChar; Len: byte; skip_, skip_2 : Integer):byte;
var
B: array  of Byte;
D: Word;
j,i : integer;
begin
 for i := 0 to Len - 1 do
begin
if i = skip_ then
Continue;
if i = skip_2 then
Continue;

begin
SetLength(B, len-1);
D:=0;
if Length(B) = 0 then SetLength(B, 1);
SetLength(B, Length(B) + 1);
for j:=0 to len-1 do D:=D+B[j];
for j:=low(B) to high (B) do B[j] :=D+B[j];
end;
end;
end;


Код:
crc := checksum8(PChar(buffer), buf_len, skip_ - addr1, skip_2 - addr1 );
что то не подсчитывает, где то я в функции намудрил.
Что то я в функции на мудрил....
Подскажите BDA пожалуйста! .
Вложения
Тип файла: rar Тест -3-2-32-32.rar (187 байт, 2 просмотров)

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Как в редакторах идёт?
Ну если как еще одна возможность в программе, то да. Но отдельной функцией (с точки зрения кода).
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
почему не эффективно?
Действительно ЦПУ знатная молотилка. Если верно померил время, то на строке в 1млн символов разница по времени между функциями CRCN с reverse_byte или с reverse_longword колебалась в районе одного процента. А вот "зеркалирование" алгоритма дало уже 10%, хотя я ожидал большего:
Код:
function reverse(f: LongWord): LongWord;
begin
  f := ((f shr 1) and $55555555) or ((f and $55555555) shl 1);
  f := ((f shr 2) and $33333333) or ((f and $33333333) shl 2);
  f := ((f shr 4) and $0F0F0F0F) or ((f and $0F0F0F0F) shl 4);
  f := ((f shr 8) and $00FF00FF) or ((f and $00FF00FF) shl 8);
  Result := (f shr 16) or (f shl 16);
end;

function CRCN(P: PChar; Len: LongWord; skip_i: Integer; N: Byte; Poly, Init, XorOut: LongWord; RefIn, RefOut: Boolean): LongWord;
var
  i, j: Integer;
begin
  Result := Init shl (32 - N);
  Poly := Poly shl (32 - N);
  if RefIn then
  begin
    Result := reverse(Result);
    Poly := reverse(Poly);
    for i := 0 to Len - 1 do
    begin
      if i = skip_i then
        Continue;
      Result := Result xor ord(P[i]);
      for j := 0 to 7 do
      begin
        if (Result and 1) <> 0 then
          Result := (Result shr 1) xor Poly
        else
          Result := Result shr 1;
      end;
    end;
    Result := reverse(Result) shr (32 - N);
  end
  else
  begin
    for i := 0 to Len - 1 do
    begin
      if i = skip_i 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 Poly
        else
          Result := Result shl 1;
      end;
    end;
    Result := Result shr (32 - N);
  end;
  if RefOut then
    Result := reverse(Result) shr (32 - N);
  Result := Result xor XorOut;
end;
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
имели ввиду для crc
Да, для crc имел ввиду.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
для CRC32 не ставить, там контролка из 4 байт
Это зависит не от количества байт, а от того, с каким порядком байт контрольная сумма сохранялась.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Что то я в функции на мудрил....
Ага:
Код:
function checksum8(P: PChar; Len: Word; skip_1, skip_2: Integer): Byte;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to Len - 1 do
  begin
    if (i = skip_1) or (i = skip_2) then
      Continue;
    Inc(Result, ord(P[i]));
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 21.11.2021, 21:23   #127
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ага:
Код:
function checksum8(P: PChar; Len: Word; skip_1, skip_2: Integer): Byte;
var
i: Integer;
begin
Result := 0;
for i := 0 to Len - 1 do
begin
if (i = skip_1) or (i = skip_2) then
Continue;
Inc(Result, ord(P[i]));
end;
end;
Точно перемудрил, блин проще оказалось некуда, только в одном что то не проходит , в строчке :
Код:
  crc := checksum8(PChar(buffer), buf_len, skip_ - addr1);
пишет компилятор что как вроде не актуальные параметры, не понял в чём дело и что ему не нравится ?

Цитата:
Сообщение от BDA Посмотреть сообщение
Это зависит не от количества байт, а от того, с каким порядком байт контрольная сумма сохранялась.
Тоесть либо в прямом прописана, либо в перевёрнутом, как я понял? , если в прямом, то swap не нужен, а если в перевёрнутом, то нужен , как я понимаю?
Тоесть нет единого порядка прописи контрольной суммы для всех..

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну если как еще одна возможность в программе, то да. Но отдельной функцией (с точки зрения кода).
Естественно отдельной функцией, ведь там простое сложение , а не CRC.

Цитата:
Сообщение от BDA Посмотреть сообщение
Действительно ЦПУ знатная молотилка. Если верно померил время, то на строке в 1млн символов разница по времени между функциями CRCN с reverse_byte или с reverse_longword колебалась в районе одного процента. А вот "зеркалирование" алгоритма дало уже 10%, хотя я ожидал большего:
Код:
Для современных процессоров, это даже не заметно будет.

Но а Ваше мнение , какую лучше использовать функцию эту :
Код:
 function reverse_byte(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);
  Result := (f shr 4) or (f shl 4);
end;
, или эту :
Код:
 function reverse_longword(f: LongWord): LongWord;
begin
  f := ((f shr 1) and $55555555) or ((f and $55555555) shl 1);
  f := ((f shr 2) and $33333333) or ((f and $33333333) shl 2);
  f := ((f shr 4) and $0F0F0F0F) or ((f and $0F0F0F0F) shl 4);
  f := ((f shr 8) and $00FF00FF) or ((f and $00FF00FF) shl 8);
  Result := (f shr 16) or (f shl 16);
end;

или без разницы? К какому выводу пришли ?

Цитата:
Сообщение от BDA Посмотреть сообщение
function checksum8(P: PChar; Len: Word; skip_1, skip_2: Integer): Byte; // Если так то выводит один только байт контрольной суммы , что неправильно. если на Word то правильно.
var
i: Integer;
begin
Result := 0;
for i := 0 to Len - 1 do
begin
if (i = skip_1) or (i = skip_2) then
Continue;
Inc(Result, ord(P[i]));
end;
end;
Только теперь вопрос как изменить функцию, чтоб считать и Checksum 16 и 32 ?
16 по два байта подсчитываются, а 32 по 4 байта.

С такой функцией делает только Checksum 8, изменение на Word ни чего не даёт. всё ровно Checksum 8 . как то странно с byte считает один байт контрольной суммы. что неправильно. с word, правильно, но Checsum 16 не считает.

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
С такой функцией делает только Checksum 8, изменение на Word ни чего не даёт. всё ровно Checksum 8 . как то странно с byte считает один байт контрольной суммы. что неправильно. с word, правильно, но Checsum 16 не считает.
BDA с функцией для CHECKSUM8 разобрался. всё просто:
Код:
function checksum8(P: Pchar; Len: byte; skip_i,skip_2: Integer): word;
var
i : Integer;
begin
  Result := 0;
  for i := 0 to Len -1 do
  begin
    if i = (skip_i) or(skip_2)  then
      Continue;
    Inc(Result, ord(P[i]));
  end;
end;
Код:
 crc := checksum8(PChar(buffer), buf_len, skip_i - addr1,skip_2 - addr1 );
Всё отлично. чуток подправил, но не выходит эту функцию переделать на Checksum 16 и 32.
Изменяю переменные, всё бестолку. всё ровно checksum8 выходит.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Тоесть нет единого порядка прописи контрольной суммы для всех..
Да, но правильнее сказать не контрольной суммы, а любых многобайтовых данных (см. порядок байтов).
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
или без разницы? К какому выводу пришли ?
Да, получилось без разницы. Лениво смотреть, что там в ассемблере получилось. Ну а в зеркальном алгоритме и так осталось только несколько вызовов reverse и там нужна версия именно для 32битных чисел.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
16 по два байта подсчитываются, а 32 по 4 байта.
Если верно понял, там не подсчет идет по 2 или 4 байта, а просто результат суммирования хранится в 2 или в 4 байтах.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
function checksum8(P: Pchar; Len: byte; skip_i,skip_2: Integer): word;
По идее, это уже checksum16 получился. Вы там поправьте IntToHex, чтобы выводить 2 байта.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.11.2021, 00:15   #129
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
По идее, это уже checksum16 получился. Вы там поправьте IntToHex, чтобы выводить 2 байта.
да. точно checksum16 получается. а checksum8 не получается и почему то когда исключаешь байт по адресу 2b сумму выводит не правильно совсем не ту, не пойму в чём дело?
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.
sergey.serg-72 вне форума Ответить с цитированием
Старый 22.11.2021, 00:45   #130
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
По идее, это уже checksum16 получился. Вы там поправьте IntToHex, чтобы выводить 2 байта.

Вообще фантастика, нет это Checksum 8 выходит а Checksum 16 не получается.
Стала срабатывать исключение байта, но всё ровно checksum 8
Код:
   function checksum8(P: Pchar; Len: byte; skip_i: Integer): word;
var
i : Integer;
begin
  Result := 0;
  for i := 0 to Len -1 do
  begin
    if i = skip_i  then
      Continue;
    Inc(Result, ord(P[i]));
  end;
end;

Код:
 skip_ := StrToIntDef('$' + Edit1.Text, -1);  // òàê ìîæíî è ñ 0 è ñ èñêëþ÷åíèåì áàéòà
 addr1 := Strtoint('$' + Edit3.Text); // íà÷àëüíûé àäðåñ
 addr2 := Strtoint('$' + Edit6.Text); // êîíå÷íûé àäðåñ
 buf_len := addr2 - addr1; // åñëè ïóñòî èëè 0 åñëè +1. òî ïåðåñêî÷èò è ðåçóëüòàò ìîæêò áûòü íåâåðíûì
 Fs.Position := addr1;
 SetLength(buffer, buf_len);
 Fs.Read(buffer[1], buf_len);
 crc :=checksum8(PChar(buffer), buf_len, skip_i - addr1);
 edit2.Text := IntToHex(crc, 2);
 Fs.free;
Выходит checksum 8. checksum 16 не получается.
Не пойму в чём трабла? то получалась 16 с этим кодом, теперь только 8, впал в зависание...
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