Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


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

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

Купить рекламу на форуме 20000 рублей в месяц

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

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

Сделал проверку так :

Код:
 if (Sender = SpeedButton1) and (EDit2.Text = '')  then
begin
Application.MessageBox('Введите  адрес, с которого производить запись в файл  !', 'Сообщение ', MB_Ok + MB_ICONINFORMATION);
exit;
end;
begin
offset := StrToIntDef('$' + Edit2.text, -1);
if offset = -1 then
begin
Application.MessageBox('Введен некорректный адрес, с которого производить запись в файл!', 'Сообщение', MB_Ok + MB_ICONINFORMATION);
exit;
end;
end;


procedure TForm1.Edit2Click(Sender: TObject);
begin
LoadKeyboardLayout('00000409', KLF_ACTIVATE);
end;
Можно как дополнение в edit, сразу прописать стартовый адрес 0000.
И программа будет при загрузке, уже с нулевым адресом.
А можно и без ноля, и подскажет что надо ввести адрес записи и ,если адрес некорректный , окошко предупреждения. И пользователю удобно, не переключать на Английский и проверка хорошая.

Последний раз редактировалось sergey.serg-72; 18.03.2021 в 23:57.
sergey.serg-72 вне форума Ответить с цитированием
Старый 19.03.2021, 00:24   #82
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

sergey.serg-72,

И о главном, сегодня неприятный момент выяснился про Наш Hex , что не ожидал да же .
Прислал сокурсник файл, типа софт какого то программатора не берёт файл нашего Hex, не поймут, в чём дело, прислали мне.
Стал разбираться , сделал в двух редакторах, сравниваю, отличий нет, всё идентично, не пойму в чём дело. Попросил сокурсника прислать софт программатора, стал сам проверять , сделал три файла , один наш и два от редакторов. Два от редакторов софт берёт, а наш нет, типа повреждён, или не соответствует размеру...
Ломал голову часа три, в чём дело ?, при сравнении нет расхождений.
Загнал в другую программу сравнения файлов, разницы тоже нет, всё идентично и только присмотревшись увидел что два редактора в конце файла, проставляют символ конец строки ODOA , которые мы убрали.... Стал в инете проверять конвертацию в intel Hex, везде проставляется в конце файла, во всех и редакторы тоже. Вот и меня осенило !!! видимо софт этого программатора, оказался дотошным и из за двух байт (конец строки ) расценил, что файл либо битый, либо не соответствует .... Стал проверять формат s19 и тоже все три программы и два редактора, в конце файла проставляют, эти злосчастные два байта (конец строки).
Видимо для не которых софтов программаторов, это критично.
Этот момент мы не учли , я с программаторами дел мало имел и даже не думал что это критично может быть. Хотя в описании intel hex нет, ни чего подобного. А в жизни оказалось важным (век живи, век учись),. Вот сегодня получил опыт и знания.
Видимо для форматов hex и srec, проставлять обязательно, в конце файла.

Далее прописал конец строки так :

Код:
 s := ':00000001FF';
s :=s+sLineBreak; //обязательно добавляем конец строки
Всё , после конвертации файла в hex, проставляются эти данные. И софт программатора, сразу взял наш файл. Вот такие пироги получились. Весь вечер убил, чтоб разобраться и найти причину.
Вложения
Тип файла: rar конец строки.rar (70.5 Кб, 3 просмотров)

Последний раз редактировалось sergey.serg-72; 19.03.2021 в 00:31.
sergey.serg-72 вне форума Ответить с цитированием
Старый 21.03.2021, 06:09   #83
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,172
По умолчанию

Цитата:
Сообщение от sergey.serg-72
нашёл в инете такой файл
Можно взять произвольный файл на компьютере и заменить у его расширение на bin, чтобы скормить конвертеру. Реальные bin вряд ли будут огромными, но "защиты от дурака" не предусмотрено в текущем коде.
Цитата:
Сообщение от sergey.serg-72
предназначен для микроконтроллеров и микросхем, а значить автор должен был учитывать эти моменты
Ну вот он мог и протестировать только на тех размерах bin, что действительно используются. А для произвольного размера что-то не учесть.
Цитата:
Сообщение от sergey.serg-72
Проверки должны быть когда знаешь что программа пойдёт в массы.
В идеальном мире, да.
Цитата:
Сообщение от sergey.serg-72
Многое ново для меня и впервые в коде
Из нового, вроде, только div и mod. Они используются для получения двух старших байт 4х-байтового адреса (cur_high_addr := (fbin.Position + offset) div $10000; ) или получения старшего и младшего байтов 2х-байтового адреса (sum := count + low_addr mod $100 + low_addr div $100; ).
Цитата:
Сообщение от sergey.serg-72
Ломал голову часа три, в чём дело ?, при сравнении нет расхождений.
А ведь ранее эта проблема с наличием/отсутствием новой строки в конце уже обсуждалась (на примере неработающих конвертеров).
Цитата:
Сообщение от sergey.serg-72
Хотя в описании intel hex нет, ни чего подобного. А в жизни оказалось важным
Это или недоработка программатора, так как в стандарте от Intel про переносы строк вообще ничего нет (https://archive.org/details/IntelHEXStandard), или они придерживаются немного другого стандарта.

Чуть измененный код: offset теперь типа Int64, чтобы верно обработать все 32битные смещения; фильтры убраны из кода (ушли в дизайнер формы); добавлен на форму ProgressBar, чтобы нескучно было ждать; добавлен грубый подсчет времени; немного переупорядочен код, чтобы уменьшить отступы.
Код:
procedure TForm1.Bin2HexClick(Sender: TObject);
const
  BYTES_IN_LINE = 16;
var
  fbin: TMemoryStream;
  ftxt: TMemoryStream;
  s, data_s: string;
  b: TBytes;
  offset: Int64;
  i, count, high_addr, cur_high_addr: integer;
  sum: byte;
  low_addr: word;
  start_conv, end_conv: TDateTime;
begin
  if Edit1.Text = '' then
    offset := 0
  else
  begin
    offset := StrToInt64Def('$' + Edit1.text, -1);
    if offset = -1 then
    begin
      Application.MessageBox(
        'Введен некорректный адрес, с которого производить запись в файл!',
        'Converter',
        MB_Ok + MB_ICONERROR
      );
      exit;
    end
    else if offset > High(LongWord) then
    begin
      Application.MessageBox('Слишком большой адрес!', 'Converter', MB_Ok + MB_ICONERROR);
      exit;
    end;
  end;
  if not dlgOpen1.Execute then
    exit;
  dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, '.hex');
  if not dlgSave1.Execute then
    exit;
  start_conv := Now;
  fbin := TMemoryStream.Create;
  ftxt := TMemoryStream.Create;
  fbin.LoadFromFile(dlgOpen1.FileName);
  if fbin.Size + offset > High(LongWord) then
  begin
    Application.MessageBox('Слишком большой адрес!', 'Converter', MB_Ok + MB_ICONERROR);
    fbin.Free;
    ftxt.Free;
    exit;
  end;
  Bin2Hex.Enabled := False;
  ConvBar.Max := fbin.Size div BYTES_IN_LINE;
  SetLength(b, BYTES_IN_LINE);
  high_addr := -1;
  while fbin.Position < fbin.Size do
  begin
    ConvBar.Position := ConvBar.Position + 1;
    Application.ProcessMessages;
    low_addr := fbin.Position + offset;
    cur_high_addr := (fbin.Position + offset) div $10000;
    if cur_high_addr <> high_addr then
    begin
      high_addr := cur_high_addr;
      sum := 6 + high_addr mod $100 + high_addr div $100;
      sum := -sum;
      s := Format(':02000004%.4x%.2x%s', [high_addr, sum, sLineBreak]);
      ftxt.Write(s[1], Length(s));
    end;
    count := fbin.Read(b[0], BYTES_IN_LINE);
    sum := count + low_addr mod $100 + low_addr div $100;
    data_s := '';
    for i := 0 to count - 1 do
    begin
      data_s := data_s + IntToHex(b[i], 2);
      Inc(sum, b[i]);
    end;
    sum := -sum;
    s := Format(':%.2x%.4x00%s%.2x%s', [count, low_addr, data_s, sum, sLineBreak]);
    ftxt.Write(s[1], Length(s));
  end;
  s := ':00000001FF' + sLineBreak;
  ftxt.Write(s[1], Length(s));
  ftxt.SaveToFile(dlgSave1.FileName);
  fbin.Free;
  ftxt.Free;
  Bin2Hex.Enabled := True;
  ConvBar.Position := 0;
  end_conv := Now;
  s := Format('Файл успешно преобразован и записан за %d секунд(ы).', [SecondsBetween(start_conv, end_conv)]);
  Application.MessageBox(PAnsiChar(s), 'Converter', MB_Ok + MB_ICONINFORMATION);
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.03.2021, 17:18   #84
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно взять произвольный файл на компьютере и заменить у его расширение на bin, чтобы скормить конвертеру. Реальные bin вряд ли будут огромными, но "защиты от дурака" не предусмотрено в текущем коде.
Да я проще сделал , этот bin файл в редакторе склеил несколько раз, до огромного размера и сохранил в bin. Да и не нужна защита от дурака, Вы и так всё главное включили.
А дурак и в редакторе на касячит , на каждого дурака не угодишь.
А конвертер Ваш всей группой оценили, он хороший !
sergey.serg-72 вне форума Ответить с цитированием
Старый 22.03.2021, 17:23   #85
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

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

Последний раз редактировалось sergey.serg-72; 22.03.2021 в 17:51.
sergey.serg-72 вне форума Ответить с цитированием
Старый 22.03.2021, 17:35   #86
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В идеальном мире, да.
Согласен, тут нашёл на сайте одном конвертер, он бесплатный, свободно скачивать можно.
Там bin -hex и из hex в bin. Делает всё корректно и большие файлы и давал ему файлы со смещением, он легко и корректно их переводил в bin, ни одного прокола всё корректно.
Единственный плохой (на мой взгляд) момент, он переводит в hex, всё в одну строку, что очень не удобно для анализа и исправления. Приходится в блокноте всё по рядам для лучшей наглядности.
Понятно что это не запрещено и так можно, но это для визуальности не очень хорошо.
Не зря все редакторы в 16 байт в строке, не гласно, но удобно. В остальном всё корректно и даже видно в процентах как выполняется и быстро делает всё.
И второй момент, фильтра нет и конвертер типа должен все форматы переводить в hex, но берёшь тот же s19, чтоб в hex и конверт в ошибку, за чем тогда даёшь возможность все форматы?
Тут автор не доглядел, этот момент. А пользователь видит, раз все можно, значит и s19, тхт и другие, а суёт в программу файл, а тот в ошибку однако...Фильтр надо было всё же ввести.

Последний раз редактировалось sergey.serg-72; 23.03.2021 в 02:17.
sergey.serg-72 вне форума Ответить с цитированием
Старый 22.03.2021, 17:50   #87
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Из нового, вроде, только div и mod. Они используются для получения двух старших байт 4х-байтового адреса (cur_high_addr := (fbin.Position + offset) div $10000; ) или получения старшего и младшего байтов 2х-байтового адреса (sum := count + low_addr mod $100 + low_addr div $100; ).
Да на этом моменте споткнулся ещё не проходили div и mod, я этот момент сейчас изучил один даёт целочисленное значение от делимого удобно, второй mod остаток от целочисленного деления.
Единственное что пока не приходилось с этим сталкивать ся, в примерах на сайтах понятно когда 17/2 =8 отбрасываем 5, а вот по mod 19/ 4 =3 применять не приходилось и по этому пока момент не совсем понятный ... Разве отниманием от определённого значения (константы) нельзя добится того же ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 22.03.2021, 17:53   #88
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А ведь ранее эта проблема с наличием/отсутствием новой строки в конце уже обсуждалась (на примере неработающих конвертеров).
Да я про этот момент помню, но кто мог подумать что софт, какого то программатора упрётся на ерунде , не имеющей отношения к формату, а только на 2 байта размер больше. Вроде разработчик софта для программатора, это должен быть профи высокого класса, а получается что то же не всегда ....
sergey.serg-72 вне форума Ответить с цитированием
Старый 22.03.2021, 17:55   #89
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
то или недоработка программатора, так как в стандарте от Intel про переносы строк вообще ничего нет (https://archive.org/details/IntelHEXStandard), или они придерживаются немного другого стандарта.
Я тоже к этому пришёл уже, в софте данные разработчика, я ему отписал по этому поводу почему он так критично на конце строки упёрся и на основании чего?
sergey.serg-72 вне форума Ответить с цитированием
Старый 22.03.2021, 18:17   #90
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Чуть измененный код: offset теперь типа Int64, чтобы верно обработать все 32битные смещения; фильтры убраны из кода (ушли в дизайнер формы); добавлен на форму ProgressBar, чтобы нескучно было ждать; добавлен грубый подсчет времени; немного переупорядочен код, чтобы уменьшить отступы.
Да Вы правы идея та отличная я об этом и не подумал бы.

Но есть вопросы :
1) на этой строчке в ошибку уходит и не компилируется

s := Format('Файл успешно преобразован и записан за %d секунд(ы).', [SecondsBetween(start_conv, end_conv)]);
Компилятору не нравится SecondsBetween (пишет что ошибка идентификации ) как я понял что этот момент где то не прописан в глобальных переменных?
В общем не компилируется и в ошибку уходит на этой строчки.



3) не понятны эти переменные : start_conv, end_conv: TDateTime;(понятно что что то запускает от начало и до конца, явно с таймером связь) .
Видимо Вы таймер как то использовали на форме?
Не понятный момент с этими данными. (чего то не хватает)
С прогресс баром всё понятно .
И если убрать не рабочую строку (в ошибку которая уходит)
То всё отлично !
И под этим, Вы что подразумевали таймер ? SecondsBetwee не понятный момент но из за него ошибка и не компилируется.

А вот с этим понятно , я к стате изначально про него думал offset: Int64; сразу 8 байт может вмещать. Хотя максимальный ввод в программках что был это 7 значений и всё не введёшь больше. А так 5 и точка. Может в edit ограничение поставить в 5, или 7 символов максимально ?


Всё , вопрос снят полностью и с переменными start_conv, end_conv: TDateTime тоже разобрался почему компилятор бычился на SecondsBetween это функция и конечно её надо было прописать в ; uses DateUtils; Функция SecondsBetween в Delphi
Используемый модуль: DateUtils.
Я этого не знал, этого не проходили, но теперь знаю ,что это и с чем её едят...
Вопрос снят полностью.
Я добавил некоторые дополнения чтоб progresы Bar, не видим был при загрузке + применил свой приём, чтоб место не занимать на форме, в общем получился супер конвертер от BDA.
Для сокурснице поменял ProgressBar, на Gauge, с процентами и получился супер !
Вложения
Тип файла: rar Bin2_hex_.rar (459.0 Кб, 1 просмотров)

Последний раз редактировалось sergey.serg-72; 23.03.2021 в 02:58. Причина: дописывание
sergey.serg-72 вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS