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

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


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

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


Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2021, 17:44   #121
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,006
По умолчанию

Отличия минимальны. Только автовыбор s19, s28, s37 добавляет несколько if`ов.
Код:
procedure TForm1.Bin2SrecClick(Sender: TObject);
const
  BYTES_IN_LINE = 16;
  sLineEnd = #13#10;
var
  fbin, ftxt: TFileStream;
  s, data_s, file_format, data_line, termination_line: string;
  b: TBytes;
  offset, addr: Int64;
  i, count, read_count: integer;
  ext_bytes, sum: byte;
  start_conv, end_conv: TDateTime;
begin
  fbin := nil;
  ftxt := nil;
  try
    try
      getOffset(offset);
      if not dlgOpen1.Execute then
        exit;
      fbin := TFileStream.Create(dlgOpen1.FileName, fmOpenRead or fmShareDenyWrite);
      if fbin.Size > Limit32 then
        raise Exception.Create('Слишком большой файл!');
      addr := fbin.Size + offset;
      if addr > Limit32 then
        raise Exception.Create('Слишком большой адрес конца файла!');
      if addr > Limit24 then
      begin
        file_format := '.s37';
        ext_bytes := 5;
        data_line := 'S3%.2x%.8x%s%.2x'  + sLineEnd;
        termination_line := 'S70500000000FA' + sLineEnd;
      end
      else if addr > Limit16 then
      begin
        file_format := '.s28';
        ext_bytes := 4;
        data_line := 'S2%.2x%.6x%s%.2x'  + sLineEnd;
        termination_line := 'S804000000FB' + sLineEnd;
      end
      else
      begin
        file_format := '.s19';
        ext_bytes := 3;
        data_line := 'S1%.2x%.4x%s%.2x'  + sLineEnd;
        termination_line := 'S9030000FC' + sLineEnd;
      end;
      dlgSave1.Filter := Format('Motorola SREC File (*%s)|*%s', [file_format, file_format]);
      dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, file_format);
      if not dlgSave1.Execute then
        exit;
      start_conv := Now;
      ftxt := TFileStream.Create(dlgSave1.FileName, fmCreate or fmShareDenyWrite);
      BeforeConvert(Sender, fbin.Size div BYTES_IN_LINE);
      SetLength(b, BYTES_IN_LINE);
      s := 'S00600004844521B' + sLineEnd;
      ftxt.Write(s[1], Length(s));
      while fbin.Position < fbin.Size do
      begin
        ConvBar.Position := ConvBar.Position + 1;
        Application.ProcessMessages;
        addr := fbin.Position + offset;
        read_count := fbin.Read(b[0], BYTES_IN_LINE);
        count := read_count + ext_bytes;
        sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) and $FF + (addr shr 24) and $FF;
        data_s := '';
        for i := 0 to read_count - 1 do
        begin
          data_s := data_s + IntToHex(b[i], 2);
          Inc(sum, b[i]);
        end;
        sum := $FF - sum;
        s := Format(data_line, [count, addr, data_s, sum]);
        ftxt.Write(s[1], Length(s));
      end;
      ftxt.Write(termination_line[1], Length(termination_line));
      AfterConvert(Sender);
      end_conv := Now;
      s := Format('Файл успешно преобразован и записан за %d секунд(ы).', [SecondsBetween(start_conv, end_conv)]);
      Application.MessageBox(PAnsiChar(s), 'Converter', MB_Ok + MB_ICONINFORMATION);
    except
      on E : Exception do
        Application.MessageBox(PAnsiChar(E.Message), 'Converter', MB_Ok + MB_ICONERROR);
    end;
  finally
    fbin.Free;
    ftxt.Free;
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.04.2021, 05:19   #122
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Отличия минимальны. Только автовыбор s19, s28, s37 добавляет несколько if`ов.
Да же не знаю что и сказать BDA, сказать отлично, это ни чего не сказать !!!
Вы сделали все три s всё на автомате, просто класс и супер !!!
Пробежал по быстрому и как понял привязка к адресу ?
Не к размеру файла.
Завтра буду заниматься и тестить .
Надо всё тщательно разобрать . Сегодня поздно уже.
Но я боюсь, что привязка к адресу, может быть не точной +- байт уже играет роль.
То есть редакторы строго s19 от 0 , до 65536 байт включительно, переключение только на 65537 байтах на s2, ну и.т.д. Завтра проверю этот момент укладывается , или нет.
Буду теперь изучать и усваивать.
Огромное, Вам спасибочки BDA !!!
sergey.serg-72 вне форума Ответить с цитированием
Старый 01.04.2021, 15:22   #123
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Отличия минимальны. Только автовыбор s19, s28, s37 добавляет несколько if`ов.
Всё таки прозвучал свисток арбитра ....
Автовыбор дал осечку, как я и предполагал , привязка к адресу не даёт 100% точности.

1) Переключается на s28 при 65536 байтах , а это не правильно, так как 65536 байт это ещё s19
должно переключатся на s28 при 65537 байтах. Слишком рано переключается.

2)с s28 на s37 переключается при 16777216 тоже не правильно должно переключатся при 16777217 байтах. Проверил в двух редакторах так и есть.
У нас переключается на один байт раньше, что идёт в разрез с редакторами, значит от нормы отошли.

Что попробовал ? сделал по размеру так :

Код:
 if addr > Limit32 then
raise Exception.Create('Слишком большой адрес конца файла!');
if fbin.Size > 16777216 then
begin
file_format := '.s37';




 end
else if fbin.Size > 65536 then
begin
file_format := '.s28';
ext_bytes := 4;
data_line := 'S2%.2x%.6x%s%.2x'  + sLineEnd;
termination_line := 'S804000000FB' + sLineEnd;
end
else
begin
file_format := '.s19';
Это блестяще решило задачу.
Теперь один, в один с редакторами идёт и переключается как надо.
Получается что размер даёт большую точность, чем адрес ?
Тесты продолжаю . Каждый шаг, сверка с редактором.
И всё же правильно я тогда сделал, что отловил размеры переключения.
Мне кажется, что редакторы, тоже на размер файла оринтируются, а уж потом на адрес.
Хотя может и не прав я.
Но пока именно так, решило задачу.
Не понятно почему при адресации, переключается на один байт раньше, а вот при размере файла всё отлично и переключение как надо.
Продолжаю тестить.
sergey.serg-72 вне форума Ответить с цитированием
Старый 01.04.2021, 16:47   #124
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,006
По умолчанию

Да, пожалуй, на один байт промахнулся. Нужно исправить две строчки:
Код:
if fbin.Size - 1 > Limit32 then
...
addr := fbin.Size + offset - 1;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.04.2021, 16:50   #125
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

sergey.serg-72,

Вот как не вспомнить Вас BDA, ещё раз добрым словом, что тесты, это главное !!!
В ходе жесточайших тестов , Наша прога , после моих изменений стоит как кремень, касячить не хочет. Всё корректно и всё отлично, полёт отличный !!!
Чего не скажешь о редакторе (хвалёном) HxD, редактор стал касячить , уже на файле 16777217 -s37, перевожу файл редактором HxD и нашей прогой , размер один, всё вроде хорошо, загоняю в редактор сверки файлов, одно не совпадение... Далее пытаюсь открыть файлы в редакторе Тритон (вспомним добрым словом) наш файл открывает и всё отлично, а вот файл , после редактора HxD, загружать отказывается , пишет что ошибка контрольной суммы строки..... и не загружает . Далее, есть три проги конвертации из srec в bin, все три проги отлично и корректно сконвертили файл, после нашей проги (при сверке в редакторе с оригиналом, нет расхождений), а вот файл, после редактора HxD проги отказались конвертить, пишут что ошибка строки и файл повреждён.... Из чего вывод : редактор HxD конвертит файлы уже с размера 16777217 не корректно и с ошибкой. Далее, увеличил размер файла прибавил к 16777217 байтом, ещё несколько сотен байт. Сконвертил нашей прогой и редактором HxD, при сравнении уже 32 не совпадения и опять редактор Тритона, наш файл загружает и всё окей, три проги переконвертируют всё отлично с оригиналом. А вот файл после HxD, отказывается грузить Тритон и все три проги отказываются конвертить в bin, пишут что ошибка файла.....
Чудеса и только. Но просматривается не хороший момент, что доверять редактору HxD , особенно когда большой файл s37 нельзя, может касячить.
Софт тритона всё корректно делает как и наша программа, пока нет замечаний, полёт продолжается. Чудеса и только вроде всё по редактору HxD делали, но при больших файлах расхождения идут и редакторский не загружают другие проги и редактор. Чудеса, да и только.
Вложения
Тип файла: rar фото.rar (120.9 Кб, 1 просмотров)

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, пожалуй, на один байт промахнулся. Нужно исправить две строчки:
Сейчас исправлю и за ново тестить начну.
А с размером не лучший вариант ?, какие могут быть проблемы с ним ?
Пока с размером прога проходит все тесты на отлично.
Сейчас с исправлениями начну тестить с начало.
sergey.serg-72 вне форума Ответить с цитированием
Старый 01.04.2021, 17:27   #127
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,006
По умолчанию

Цитата:
Сообщение от sergey.serg-72
А с размером не лучший вариант ?, какие могут быть проблемы с ним ?
Это одно и то же. Просто чтобы записывать if с константами текущими (для красоты) и учитывать смещение, то удобнее высчитывать адрес конца файла.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.04.2021, 17:43   #128
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

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

Ну и главное, я с точностью могу теперь сказать , что редактор HxD файлы формата s37 (большие файлы) обрабатывает не корректно и портит. Это уже факт !!!

Редактор Тритона при загрузке файлов разных форматов, hex, srec,rom и другие , когда загружает, то выводит все данные в bin при загрузке пересчитывает строки форматов и если битые, то загружать отказывается... Он категорически отказывается загружать файлы s37 после редактора HxD, после нашей загружает, после других софтов, поник и другие загружает, а вот после редактора HxD пишет что контрольная сумма строки неправильная и не загружает.
Три проги которые конвертят из srec в bin тоже отказываются после него конвертить, пишут что ошибка. После нашей берут и конвертят. Это как? либо я дурак, но тогда и софт Тритона и три проги тоже некорректные, или всё же редактор HxD касячит с большими файлами?
Я склоняюсь что проблема в редакторе. Что то с ошибкой делает он явно.
Пятый раз тестю и всё одно и тоже, ошибка и всё тут.
Что это BDA ? случайность, или нет ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 01.04.2021, 18:47   #129
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,006
По умолчанию

Цитата:
Сообщение от sergey.serg-72
редактор HxD файлы формата s37 (большие файлы) обрабатывает не корректно и портит
Цитата:
Сообщение от sergey.serg-72
ошибка и всё тут.
Не знаю. Создал файлы размеров 16 777 217 байт и 16 777 232 байт, сконвертировал в s37 своей и HxD (Версия 2.4.0.0 (x86-64)) - результат одинаковый.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.04.2021, 23:45   #130
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 114
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Не знаю. Создал файлы размеров 16 777 217 байт и 16 777 232 байт, сконвертировал в s37 своей и HxD (Версия 2.4.0.0 (x86-64)) - результат одинаковый.
Вот точно косячит , уже доказано, правда у меня версия 1.7.7.0, может у меня версия ранняя и в ней ошибка? 10 раз проверял и ошибка в моей версии.

Сделал конвертер супер !!! для себя , но для предъявления Джонсу (так как не оговаривалось какой именно) то для зачёта сделал такой. Пришлось убрать все плюшки, чтоб не запалится. Ваше мнение BDA ?

Код забыл с архивом , прикладываю.
Вложения
Тип файла: rar Cjnverter_bin_s19_.rar (458.2 Кб, 2 просмотров)
Тип файла: txt код.txt (2.3 Кб, 1 просмотров)

Последний раз редактировалось sergey.serg-72; 01.04.2021 в 23:55.
sergey.serg-72 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно создать "батник", вырезать из "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