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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
if Lines.Count > 0 then
Lines.Add('Что-то плохо')
else
Lines.Add('Все хорошо');
То что надо теперь !

Цитата:
Сообщение от BDA Посмотреть сообщение
Не вижу в ней смысла при проверке корректности. С количеством строк вы и сами справились (st.Count). Для узнавания размера лучше уж воспользоваться TFileStream вместо TMemoryStream, чтобы меньше занимать оперативной памяти.
Согласен , исправил !

Цитата:
Сообщение от BDA Посмотреть сообщение
WRONG CHECKSUM 0xF - 4: S21400803024015CA04D9FA2009037957F8 C20359E42
Сумма получилась 0xF (а должна быть 0xFF), номер неверной строки 4, а далее сама строка.
С номером строки разобрался, а вот с 0xF (а должна быть 0xFF) нет, что значит сумма получилась
0xF (а должна быть 0xFF),? какая в конечном счёте должна быть контрольная сумма ? думаю что надо выводить новую контрольную сумму, за место не понятного 0xF (а должна быть 0xFF), новая контрольная сумма которую можно поставить и исправить в файле, так понятней и информативней. А что даст пользователю 0xF (а должна быть 0xFF)? на какую сумму исправлять в итоге? в ручную пересчитывать ? это не айс ! Думаю за место 0xF надо писать новую контрольную сумму , которая должна быть.

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Да нет, ошибки есть. "len mod 1 <> 0" - строка должна быть нечетной длины, но делить нужно на 2 "len mod 2 = 0". "StrToIntDef(':'" - откуда взялось двоеточие? Тут должна формироваться строка вида "$XX", которая преобразуется в 16ричное число. "if k = +1 then" - почему +1? -1 означает, что строка неудачно преобразовалась в число. "if sum <> 255 then" для HEX нужно сравнивать с нулем.
Всё исправил, но всё ровно ошибка : не понятно это :"$XX" $ это шестнадцатетиричное значение , а что означает ХХ ?

Код:
 var
  st: TStringList;
  f: TFileStream;
  i, j, k, len: integer;
  sum: byte;
  err_flag: boolean;
begin
Memo1.Clear;
label1.Caption:=' ';
label2.Caption:=' ';
  OpenDialog1.Filter := 'Hex File (*.Hex)|*.Hex';
  if not OpenDialog1.Execute then
    exit;
f:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);

  st := TStringList.Create;
  st.LoadFromFile(OpenDialog1.FileName);

with Memo1 do
  begin
    Clear;

Lines.BeginUpdate;
 for i := 0 to st.Count - 1 do
    begin
      len := length(st[i]);
      if len mod 2 = 0 then
      begin
        Lines.Add(Format('Неправильная длина линии  - %d: %s', [i + 1, st[i]]));
        continue;
      end;
      err_flag := False;
      sum := 0;
      j := 3;
      while j < len do
      begin
        k := StrToIntDef('$' + st[i][j] + st[i][j + 1], -1);
        if k = -1 then
        begin
          Lines.Add(Format('Недопустимый символ в строке - %d: %s', [i + 1, st[i]]));
          err_flag := True;
          break;
        end;
        Inc(sum, k);
        Inc(j, 2);
      end;
      if err_flag then
        continue;
      if sum <> 0 then
      begin
        Lines.Add(Format(' Ошибка контрольной суммы  0x%x - %d: %s', [sum, i + 1, st[i]]));
        continue;
      end;
    end;
   if Lines.Count > 0 then
  Lines.Add(' Есть ошибки !')
else
  Lines.Add('Ошибок не выявлено !.');
    Lines.EndUpdate;
     label2.Caption:= 'Количество байт в файле :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
    Label1.Caption :='Количество строк в файле :  ' + IntToStr(st.Count-1);
  end;
  st.Free;
   F.Free;
end;
Всё ровно ошибка пишет что :Недопустимый символ в строке , или неправильная контрольная сумма . Блин, в чём засада ?

Последний раз редактировалось BDA; 01.04.2022 в 02:47.
sergey.serg-72 вне форума Ответить с цитированием
Старый 31.03.2022, 02:40   #362
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Всё ровно ошибка пишет что :Недопустимый символ в строке , или неправильная контрольная сумма . Блин, в чём засада ?
Исправил показывает корректно проверьте BDA код:

Код:
 var
  st: TStringList;
  f: TFileStream;
  i, j, k, len: integer;
  sum: byte;
  err_flag: boolean;
begin
Memo1.Clear;

  OpenDialog1.Filter := 'Hex File (*.Hex)|*.Hex';
  if not OpenDialog1.Execute then
    exit;
f:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);

  st := TStringList.Create;
  st.LoadFromFile(OpenDialog1.FileName);

with Memo1 do
  begin
    Clear;

Lines.BeginUpdate;
 for i := 0 to st.Count - 1 do
    begin
      len := length(st[i]);
      if len mod 2 = 0 then
      begin
      Lines.Add(Format('Неправильная длина линии - %d: %s', [i , st[i]]));
        continue;
      end;
      err_flag := False;
      sum := 0;
      j := 2;
      while j < len do
      begin
        k := StrToIntDef('$' + st[i][j] + st[i][j + 1], -1);
        if k = -1 then
        begin
        Lines.Add(Format('Недопустимый символ в строке - %d: %s', [i , st[i]]));
          err_flag := True;
          break;
        end;
        Inc(sum, k);
        Inc(j, 2);
      end;
      if err_flag then
        continue;
      if sum <> 0 then
      begin
       Lines.Add(Format(' Ошибка контрольной суммы  0x%x -  %d: %s', [sum, i , st[i]]));
        continue;
      end;
    end;
   if Lines.Count > 0 then
  Lines.Add(' Есть ошибки !')
else
 Lines.Add('Ошибок не выявлено ! .');
    Lines.EndUpdate;
    label2.Caption:= 'Количество байт в файле :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
    Label1.Caption :='Количество строк в файле :  ' + IntToStr(st.Count-1);

  end;
  st.Free;
   F.Free;
end;

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
а что означает ХХ
Это два символа из строки, которые нужно преобразовать в число. Но это вы уже поправили, как было.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
проверьте
Сейчас Clear делается два раза. Можно один из них удалить. Для вывода верной контрольной суммы для HEX попробуйте примерно так:
Код:
if sum <> 0 then
begin
  sum := k - sum;
  Lines.Add(Format('Ошибка контрольной суммы 0x%.2x (верная 0x%.2x) - %d: %s', [k, sum, i, st[i]]));
  continue;
end;
Код проверки HEX можно улучшить, если проверять еще: первый символ строки должен быть двоеточием; длина строки ограничена минимальным и максимальным значением; значение поля, хранящего количество байтов данных, равно реальному количеству; поле типа имеет допустимое значение.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 31.03.2022, 18:52   #364
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Lines.Add(Format('WRONG CHECKSUM 0x%x - %d: %s', [sum, i + 1, st[i]]));
Цитата:
Сообщение от BDA Посмотреть сообщение
Сейчас Clear делается два раза. Можно один из них удалить. Для вывода верной контрольной суммы для HEX попробуйте примерно так:
Да согласен , один убираем.

Цитата:
Сообщение от BDA Посмотреть сообщение
попробуйте примерно так:
Код:
if sum <> 0 then
begin
sum := k - sum;
Lines.Add(Format('Ошибка контрольной суммы 0x%.2x (верная 0x%.2x) - %d: %s', [k, sum, i, st[i]]));
continue;
end;
Да, всё верно делает и считает верно и новую верно показывает , всё окей!, но компилятор выписал предупреждение , которого не было.
В чём причина?

Цитата:
Сообщение от BDA Посмотреть сообщение
Код проверки HEX можно улучшить, если проверять еще: первый символ строки должен быть двоеточием; длина строки ограничена минимальным и максимальным значением; значение поля, хранящего количество байтов данных, равно реальному количеству; поле типа имеет допустимое значение.
А можно подробней на этом моменте, а то не как не врублюсь ?......

Цитата:
Сообщение от BDA Посмотреть сообщение
Для вывода верной контрольной суммы для HEX попробуйте примерно так:
Код:
if sum <> 0 then
begin
sum := k - sum;
Lines.Add(Format('Ошибка контрольной суммы 0x%.2x (верная 0x%.2x) - %d: %s', [k, sum, i, st[i]]));
continue;
end;

А для Srec тоже надо тогда код такой.
Изображения
Тип файла: jpg 1.JPG (11.0 Кб, 9 просмотров)

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Для вывода верной контрольной суммы для HEX попробуйте примерно так:
А для SREC так :
Код:
 if sum <> 255 then
begin
  sum := sum  + 1;
  sum := k  - sum;
  Lines.Add(Format('Ошибка контрольной суммы 0x%.2x (верная 0x%.2x) - %d: %s', [k, sum, i+ 1, st[i]]));
  continue;
end;
end;
Но тоже предупреждение компилятора : [Предупреждение] Unit1.pas(154): Variable 'k' might not have been initialized

Это не нормально .

Цитата:
Сообщение от BDA Посмотреть сообщение
Код проверки HEX можно улучшить, если проверять еще: первый символ строки должен быть двоеточием; длина строки ограничена минимальным и максимальным значением; значение поля, хранящего количество байтов данных, равно реальному количеству; поле типа имеет допустимое значение.
Ни как не пойму этот момент, как двоеточие проверить в строке есть, или нет ?

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
компилятор выписал предупреждение , которого не было
Потому что теперь значение k используется после цикла while, а получает его только внутри цикла, а он может ни разу не выполниться. Тогда k будет использоваться до инициализации. Можно отказаться от err_flag и использовать k для тех же целей:
Код:
sum := 0;
k := -1;
j := 2;
while j < len do
begin
  k := StrToIntDef('$' + st[i][j] + st[i][j + 1], -1);
  if k = -1 then
  begin
    Lines.Add(Format('Недопустимый символ в строке - %d: %s', [i , st[i]]));
    break;
  end;
  Inc(sum, k);
  Inc(j, 2);
end;
if k = -1 then
  continue;
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
для SREC так
Можно и в одну строку "sum := k - sum - 1;".
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
как двоеточие проверить в строке есть, или нет
Код:
if st[i][1] <> ':' then
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.04.2022, 04:53   #367
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Потому что теперь значение k используется после цикла while, а получает его только внутри цикла, а он может ни разу не выполниться. Тогда k будет использоваться до инициализации. Можно отказаться от err_flag и использовать k для тех же целей:
Вот теперь разобрался,флаг убрал и болеан, всё теперь без предупреждений и советов.
Решили момент.

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно и в одну строку "sum := k - sum - 1;".
Действительно можно и одной строкой меньше.
Решили момент.

Цитата:
Сообщение от BDA Посмотреть сообщение
if st[i][1] <> ':' then
С условием понятно, не понятно куда лучше вставлять код и как лучше выводить сообщение об ошибки ? Например софт тритона не открывает файл, если в строке нет хоть одного двоеточия и пишет об ошибке. Сделал так, но как то не нравится момент этот ...

Код:
for i := 0 to st.Count - 1 do
begin
len := length(st[i]);
if len mod 2 = 0 then
begin
Lines.Add(Format('Неправильная длина линии str № %d: %s', [i, st[i]]));
continue;
end;
if st[i][1] <> ':' then
begin
Lines.Add(Format('Некорректная строка  str № %d: %s', [i, st[i]]));
continue;
end;

k := -1;
sum := 0;
j := 2;
А тритон пишет что файл нулевой длины, хотя файл полный, просто в строке нет , одного двоеточия. А что мне писать и куда, лучше вставить код?

Цитата:
Сообщение от BDA Посмотреть сообщение
Код проверки HEX можно улучшить
К стате и не только Hex но и SREC надо улучшить.
Проблема в следующим : как мы знаем что в файлах есть верхняя шапка и нижняя
S0030000FC и :020000040000FA и нижние, шапки в подсчёте контрольной суммы не должны участвовать,а также на длину строки и номер строки.
Тритон открывает и с повреждённой шапкой и сам делает файлы без шапок.
А у нас прога считает с этой строки и если длина не та, или контролка не та то в ошибку уходит.
Так как многие конверты делают вообще без шапки и программаторы игнорят эти данные.
Надо и нам исключить из подсчёта и вообще игнорить шапки они на правильность файла не влияют. А значит, их надо исключить и подсчёт начинать с данных только.
Момент этот важный думаю, в шапку можно что угодно записать, а прога будет выводить ошибку и тем самым, вводить в заблуждение пользователя.
Изображения
Тип файла: jpg 1.JPG (16.0 Кб, 8 просмотров)

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А что мне писать и куда, лучше вставить код?
Да, место хорошее (после проверки, что длина строки нечетная, значит хотя бы один символ в строке есть). А в сообщении стоит написать, что не хватает двоеточия, а то будет непонятно, что именно исправлять.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
А тритон пишет что файл нулевой длины
Да уж, очень информативное сообщение у тритона
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Так как многие конверты делают вообще без шапки и программаторы игнорят эти данные.
Не вижу смысла в игнорировании: лишний код для аккуратного игнорирования; если шапки неверны, то пусть пользователь сам их и сотрет.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.04.2022, 02:31   #369
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, место хорошее (после проверки, что длина строки нечетная, значит хотя бы один символ в строке есть). А в сообщении стоит написать, что не хватает двоеточия, а то будет непонятно, что именно исправлять.
Принято и исправлено.

Цитата:
Сообщение от BDA Посмотреть сообщение
Да уж, очень информативное сообщение у тритона
Да, хорошо хоть так, другие редакторы и этого не делают тот же хвалённый HxD.

Цитата:
Сообщение от BDA Посмотреть сообщение
Не вижу смысла в игнорировании: лишний код для аккуратного игнорирования; если шапки неверны, то пусть пользователь сам их и сотрет.
Согласен , всё оставляем, прога готова и питон отдыхает . Не надо , ни чего скачивать, вирусов нет, своя и понятно всё. Мне кажется что никто , пока кроме нас эту задачу не решал, так мне кажется. Готовы тестить ? Тогда в архиве, вирусов нет, проверенно двумя антивирусами, мои все чистые и сама среда чистая. Так что всё безопасно. И загрузилась легко на сайт. Так что питон курит....

Последний раз редактировалось BDA; 05.04.2022 в 02:31.
sergey.serg-72 вне форума Ответить с цитированием
Старый 02.04.2022, 05:49   #370
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Архив стер (все равно он с паролем). Верную чексумму назвал бы correct (ну это не важно). Лучше выкладывайте просто код - легче искать недочеты. Из количества строк не нужно вычитать единицу. Нумерация строк в текстовых редакторах чаще всего начинается с единицы, так что в сообщениях об ошибках тоже лучше так. Для hex строка ":" сейчас считается корректной - нужно проверять на минимальную длину. Для srec первый символ должен быть S, а второй от 0 до 9, а сейчас могут быть любыми.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно создать "батник", вырезать из "2.txt" первых n строк и вставить их в "1.txt" temphard Помощь студентам 2 03.09.2013 16:03
Удаление первых n-строк из txt-файла Neksion Помощь студентам 2 10.07.2013 18:12
Создать чтение из файла и запись в файл txt на С++ skifre Фриланс 0 01.06.2012 16:16
поиск и выципление строк из txt файла D_e_n_n Помощь студентам 7 04.02.2011 05:39
C# Представление txt файла как массива строк asheb Помощь студентам 7 20.04.2010 12:51