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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
skip_ := skip_ - addr1;
buf_len := addr2 - addr1;
D := 0;

F.Position:= addr1;
SetLength(A, buf_len);
F.Read(A[0], buf_len);
for j := 0 to buf_len - 1 do
begin
if j = skip_ then
Continue;
Inc(D, A[j]);
end;
Edit2.Text := IntToHex(D, 4);
Label1.Caption := 'Checksum_8';
A:=nil;
Это исправления некоторых проблем и исключение одного байта для SUM-8. Но с 16 так просто не получится.

BDA Приветствую ! отлично вышло у Вас, я изначально цикл не правильно строил.
А что с 16, почему не получится ? Как быть с 16 ? Всётаки функция нужна будет ?
Я вот использовал, функцию и сделал так, но считает не корректно.
В чём ошибка ?
Код:
function checksum8(P: PChar; Len: Word; skip_, skip_2: Integer): word;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to Len - 1 do
  begin
    if (i = skip_) or (i = skip_2) then
      Continue;
    Inc(Result, ord(P[i]));
  end;
end;


var
A: array  of byte; // 
f: TFileStream;
D,crc,w: Word;
j, addr1, addr2, addr3,skip_,skip_2, buf_len:integer;
buffer: String;
begin
label1.Caption:=' ';
edit2.Clear;
edit4.Clear;
edit5.Clear;
OpenDialog1.Filter := 'BIN (*.bin)|*.bin';
with OpenDialog1 do
if Execute then
begin
F:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);
if F.Size < 0  then
begin
ShowMessage('не тот файл  !');
F.Free;
exit;
end;
begin
edit5.Text:=ExtractFileName(OpenDialog1.FileName);
label2.Caption:= 'Size :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
addr3:= StrToIntDef('$' + Edit6.Text, -1); // êîíå÷íûé àäðåñ
F.Position :=addr3;
F.Read(w, 2);
w := swap(w);
Edit4.Text:=' '+IntToHex(w,2);
skip_2:= StrToIntDef('$' + Edit8.Text, -1);
skip_ := StrToIntDef('$' + Edit7.Text, -1);  //
addr1 := Strtoint('$' + Edit1.Text); //
addr2 := Strtoint('$' + Edit3.Text); // 
buf_len:= addr2 - addr1+0;
F.Position:= addr1;;
SetLength(buffer,  buf_len);
F.Read(buffer[1], buf_len);
crc :=checksum8(PChar(buffer), buf_len, skip_ - addr1, skip_2 - addr1 );
edit2.Text := IntToHex(crc, 2);
label1.Caption:='Checksum_8 ';
A:=nil;
end;
F.Free;
end;
end;
А как же быть с 16 и 32 ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 23.11.2021, 04:15   #142
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Это исправления некоторых проблем и исключение одного байта для SUM-8. Но с 16 так просто не получится.
Да, Вы правы с 16 касячит, неправильно считает, даже , если с одним байтом исключения, не говоря уже о двух, а как исправить ?

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
сделал так, но считает не корректно. В чём ошибка ?
Не запускал. Визуально ошибок не вижу. Проверьте вводимые адреса.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А как же быть с 16 и 32 ?
Код:
function checksum16(P: PChar; Len: Word; skip_1, skip_2: Integer): Word;
var
  i, j: Integer;
begin
  Result := 0;
  j := 0;
  for i := 0 to Len - 1 do
  begin
    if (i = skip_1) or (i = skip_2) then
      Continue;
    Result := Result + ord(P[i]) shl (8 * j);
    j := (j + 1) mod 2;
  end;
end;
Но такой подсчет работает не совсем так, как в тритоне. Тритон втихую (хотя может быть в инструкции что-нибудь и сказано) делает диапазон кратным 2 байтам. То есть чтобы результат этой функции и тритона совпал, нужно ввести верные адреса. А еще я не знаю, как тритон считает сумму, если начинать не с четного байта, так как лень ставить тритон и проверять.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 23.11.2021, 07:02   #144
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Но такой подсчет работает не совсем так, как в тритоне. Тритон втихую (хотя может быть в инструкции что-нибудь и сказано) делает диапазон кратным 2 байтам. То есть чтобы результат этой функции и тритона совпал, нужно ввести верные адреса. А еще я не знаю, как тритон считает сумму, если начинать не с четного байта, так как лень ставить тритон и проверять.
Проверю, на как я понял код уже будет другой, не такой как в checksum8 , а как на CRC ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 23.11.2021, 07:24   #145
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
function checksum16(P: PChar; Len: Word; skip_1, skip_2: Integer): Word;
var
i, j: Integer;
begin
Result := 0;
j := 0;
for i := 0 to Len - 1 do
begin
if (i = skip_1) or (i = skip_2) then
Continue;
Result := Result + ord(P[i]) shl (8 * j);
j := (j + 1) mod 2;
end;
end;

Что то с функцией и с кодом, вообще не считает, нули (00) на выходе после подсчёта.
не пойму в чём дело, функция то на старые алгоритмы и всё гуд, а здесь не считает , в чём проблема, где я на касячил?
Код:
 edit5.Text:=ExtractFileName(OpenDialog1.FileName);
label2.Caption:= 'Size :'+' ' +IntToStr(fs.Size)+ ' ' + ' '+'Byte';
addr3:= StrToIntDef('$' + Edit7.Text, -1);
Fs.Position := addr3;
Fs.Read(w, 2);
 w := swap(w);
Edit4.Text:=' '+IntToHex(w,2);
skip_2:= StrToIntDef('$' + Edit8.Text, -1);
skip_ 1:= StrToIntDef('$' + Edit7.Text, -1);  // так можно и с 0 и с исключением байта
addr1 := Strtoint('$' + Edit1.Text); // начальный адрес
addr2 := Strtoint('$' + Edit3.Text); // конечный адрес
 Fs.Position := addr1;
 SetLength(buffer, buf_len);
 Fs.Read(buffer[1], buf_len);
 crc :=checksum16(PChar(buffer), buf_len, skip_1 - addr1, skip_2 - addr1 );
 edit2.Text := IntToHex(crc, 2);
 Fs.free;
end;
end;
sergey.serg-72 вне форума Ответить с цитированием
Старый 23.11.2021, 07:51   #146
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Проверю, на как я понял код уже будет другой, не такой как в checksum8 , а как на CRC ?
Второй вариант кода , так как первый вообще не считает.

Код:
begin
edit5.Text:=ExtractFileName(OpenDialog1.FileName);
label2.Caption:= 'Size :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
addr3:= StrToIntDef('$' + Edit6.Text, -1); // eiia?iue aa?an
F.Position :=addr3;
F.Read(w, 2);
w := swap(w);
Edit4.Text:=' '+IntToHex(w,2);
skip_2:= StrToIntDef('$' + Edit8.Text,-1);
skip_ := StrToIntDef('$' + Edit7.Text,-1);  //
addr1 := Strtoint('$' + Edit1.Text); //
addr2 := Strtoint('$' + Edit3.Text); //
buf_len:= addr2 - addr1;
F.Position:= addr1;;
SetLength(A,  buf_len);
F.Read(A[1], buf_len);
crc :=checksum16(PChar(A), buf_len, skip_ - addr1, skip_2 - addr1 );
edit2.Text := IntToHex(crc, 2);
label1.Caption:='Checksum_16 ';
A:=nil;
end;
F.Free;
end;
end;
Ну что сказать, со вторым кодом считает, неправильно ,без байта пропуска, считает правильно, с байтом пропуска 2b, совсем не та сумма выходит.

Ни первый, ни второй код не работают с функцией.

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
в чём проблема, где я на касячил?
Потеряли "buf_len:= addr2 - addr1;".
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Второй вариант кода
Нужно "F.Read(A[0], buf_len);", а то вылезаете за границу массива.
И для красоты в обоих вариантах делать "edit2.Text := IntToHex(crc, 4);", чтобы ведущие нули для 2байтового числа появились.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
без байта пропуска, считает правильно, с байтом пропуска 2b, совсем не та сумма выходит
Вы адреса верно задаете?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 23.11.2021, 22:14   #148
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Потеряли "buf_len:= addr2 - addr1;".
Да, действительно , дополнил код №1 толку ноль с байтом исключения на 2В должна быть сумму :0DAA, а программа выдаёт А4АА. вот исправленный первый код :

Код:
  edit5.Text:=ExtractFileName(OpenDialog1.FileName);
label2.Caption:= 'Size :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
addr3:= StrToIntDef('$' + Edit7.Text, -1);
F.Position := addr3;
F.Read(w, 2);
 w := swap(w);
Edit4.Text:=' '+IntToHex(w,2);
skip_2:= StrToIntDef('$' + Edit8.Text, -1);
skip_ := StrToIntDef('$' + Edit7.Text, -1);  // так можно и с 0 и с исключением байта
addr1 := Strtoint('$' + Edit1.Text); // начальный адрес
addr2 := Strtoint('$' + Edit3.Text); // конечный адрес
buf_len:= addr2 - addr1;
 F.Position := addr1;
 SetLength(buffer, buf_len);
 F.Read(buffer[1], buf_len);
 crc :=checksum16(PChar(buffer), buf_len, skip_ - addr1, skip_2 - addr1 );
 edit2.Text := IntToHex(crc, 4);
end;
 F.free;
end;
end;
С байтом исключения подсчитывает, всё ровно не верно. Исправление не помогло.
sergey.serg-72 вне форума Ответить с цитированием
Старый 23.11.2021, 22:22   #149
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
с байтом исключения на 2В должна быть сумму :0DAA, а программа выдаёт А4АА
Задайте конечный адрес на 1 байт больше.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 23.11.2021, 22:24   #150
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Нужно "F.Read(A[0], buf_len);", а то вылезаете за границу массива.
И для красоты в обоих вариантах делать "edit2.Text := IntToHex(crc, 4);", чтобы ведущие нули для 2байтового числа появились.
Исправил код №2 всё ровно результат не верный, даже , если ставлю адрес 2С, всё ровно неправильно на единицу ошибается.

Код:
 edit5.Text:=ExtractFileName(OpenDialog1.FileName);
label2.Caption:= 'Size :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
addr3:= StrToIntDef('$' + Edit6.Text, -1); // eiia?iue aa?an
F.Position :=addr3;
F.Read(w, 2);
w := swap(w);
Edit4.Text:=' '+IntToHex(w,2);
skip_2:= StrToIntDef('$' + Edit8.Text,-1);
skip_ := StrToIntDef('$' + Edit7.Text,-1);  //
addr1 := Strtoint('$' + Edit1.Text); //
addr2 := Strtoint('$' + Edit3.Text); //
buf_len:= addr2 - addr1;
F.Position:= addr1;;
SetLength(A,  buf_len);
F.Read(A[0], buf_len);
crc :=checksum16(PChar(A), buf_len, skip_ - addr1, skip_2 - addr1 );
edit2.Text := IntToHex(crc, 2);
label1.Caption:='Checksum_16 ';
A:=nil;
end;
F.Free;
end;
end;
Не помогло тоже, результат не верный.
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