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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Нужно еще в класс формы (в самом начале юнита) вписать:
Вы имели ввиду где процедуры прописываются, после события ?
type
TForm1 = class(TForm)
dlgOpen1: TOpenDialog;
dlgSave1: TSaveDialog;
Bin2Hex: TSpeedButton;
Edit1: TEdit;
procedure Bin2HexClick(Sender: TObject);
procedure BeforeConvert(Sender: TObject; barMax: Integer);
procedure AfterConvert(Sender: TObject);
procedure getOffset(var offset: Int64);

Блин так я всё правильно делал изначально прописывал.
Сейчас с третьего раза получилось, Дельфи явно тупит что то....
sergey.serg-72 вне форума Ответить с цитированием
Старый 28.03.2021, 21:54   #112
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Например, bin файл в 7.7МБ с использованием Memory преобразовывался у меня 14 секунд, а с использованием File - 7 секунд.
Сейчас провёл эксперимент , файл bin (склеен в редакторе для тестов) размер : 5305411 байт, так вот что с TMemoryStream; 34 секунды, что с TFileStream; 34 секунды трижды тестил, всё одинаково, разницы нет совсем.
sergey.serg-72 вне форума Ответить с цитированием
Старый 28.03.2021, 21:55   #113
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Это да. Но мне лень хранить кучу версий, поэтому актуальной будет только версия с 2 кнопками (хотя, возможно, кнопка в итоге будет одна).
Лучше с двумя кнопками конечно, но как Вам удобней.
sergey.serg-72 вне форума Ответить с цитированием
Старый 29.03.2021, 00:19   #114
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

[QUOTE=sergey.serg-72;1830615]Сейчас провёл эксперимент , файл bin (склеен в редакторе для тестов) размер : 5305411 байт, так вот что с TMemoryStream; 34 секунды, что с TFileStream; 34 секунды трижды тестил, всё одинаково, разницы нет совсем, пару секунд может.
но зато да, с TFileStream загрузил файл с 3,5 Гб и загрузился ведь , хотя потом прервал я процесс, долго очень ждать. А вот с TMemoryStream загрузится система не дала, типа большой файл и фигушки.
sergey.serg-72 вне форума Ответить с цитированием
Старый 31.03.2021, 15:36   #115
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Это да. Но мне лень хранить кучу версий, поэтому актуальной будет только версия с 2 кнопками (хотя, возможно, кнопка в итоге будет одна).
Цитата:
Сообщение от BDA Посмотреть сообщение
Потому что добавил на форму уже кнопку для srec.
Что то со srec не так ? Мне всё же кажется что srec всё же трудней .
sergey.serg-72 вне форума Ответить с цитированием
Старый 31.03.2021, 17:44   #116
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Отличия минимальны. Только автовыбор 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   #117
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

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

Цитата:
Сообщение от 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   #119
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

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

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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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