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

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

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

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

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

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

Цитата:
Сообщение от BDA Посмотреть сообщение
А почему он должен останавливаться, если конец второго диапазона после переноса 1E7D2.
должен, конец всего файла должен быть на адресе $0FFFF и не более, а файл выходит за этот диапазон.

Цитата:
Сообщение от BDA Посмотреть сообщение
Опять единица лишняя.
Убрал единицу.

Цитата:
Сообщение от BDA Посмотреть сообщение
А почему он должен останавливаться, если конец второго диапазона после переноса 1E7D2.
Айда батан, он видимо переутомился я всё перелопатил и должно вот так, тогда чётко будет $FFFF
Код:
       ($0000, $0FB9, $00846 ),
       ($0FBA, $F78D, $00182C)
решили этот момент.

BDA, вырезалку мы сделали, а возможно реализовать, чтоб вырезанный кусок в bin вставить в файл s19 и сохранить в s19 ? Задача думая не лёгкая, как то загрузить надо два файла, соединить и пере сохранить в S19 . Причём у вырезалке разные по размеру куски, значить и вставки разные будут по размеру. Фиксированный массив не пойдёт значит .Под любой размер . Такое возможно реализовать ?
Вот я озадачился. Такого ещё не было, вырезать проще. А вот соединить и два формата и пере сохранить в s19 и без чёткого размера ?

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
BDA, вырезалку мы сделали, а возможно реализовать, чтоб вырезанный кусок в bin вставить в файл s19 и сохранить в s19 ? Задача думая не лёгкая, как то загрузить надо два файла, соединить и пере сохранить в S19 . Причём у вырезалке разные по размеру куски, значить и вставки разные будут по размеру. Фиксированный массив не пойдёт значит .Под любой размер . Такое возможно реализовать ?
Вот я озадачился. Такого ещё не было, вырезать проще. А вот соединить и два формата и пере сохранить в s19 и без чёткого размера ?

Просидел целый день, удалось в один клик соединить 2 файла в bin правда , но ни фига не получается соединить S19 и bin....
Но зато изобрёл соединение в один два бина. Код работает

.
Код:
 var
Stream: TMemoryStream;
a: array [0..376] of Byte;
B: array [0..76] of Byte;
begin

dlgOpen1.Filter:= 'Bin File (*.Bin)|*.Bin';
if dlgOpen1.execute() then
begin
Stream := TMemoryStream.Create;
Stream.LoadFromFile(dlgOpen1.FileName);
if Stream.Size <> 376  then
begin
ShowMessage('Недопустимый размер файла, строго в  376 байт !');
Stream.Free;
exit;
end
else
begin
Stream.Position:=$0;
Stream.Read(a,376);
end;
begin
ShowMessage(' загрузите в 76 байт  ! ');
dlgOpen1.Filter:= 'Bin File (*.Bin)|*.Bin';
if dlgOpen1.execute() then
begin
Stream := TMemoryStream.Create;
Stream.LoadFromFile(dlgOpen1.FileName);
if Stream.Size <> 76 then
begin
ShowMessage('Недопустимый размер файла , строго 76 байт !');
Stream.Free;
exit;
end
else
begin
Stream.Position:=$0;
Stream.Read(b,76);
end;
begin
Stream.Position:=$0;
Stream.write(a,376);
Stream.Position:=$0;
Stream.write(b,76);
end;
begin
dlgsave1.FileName := dlgopen1.FileName;
if dlgSave1. Execute then
Stream.SaveToFile(dlgSave1.FileName+ '_Path_.bin ');
end;
Stream.Free;
end;
end;
end;
Вроде код не большой но не выходит такая операция с s19 и bin
sergey.serg-72 вне форума Ответить с цитированием
Старый 18.02.2022, 09:19   #303
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Такое возможно реализовать ?
Ну реализовать можно практически всё что угодно. Но какого-то простого и компактного способа я не вижу. Если не пытаться написать сразу суперуниверсальное решение, которое обрабатывает гигабайтные файлы, а что-то более простое, то все равно работы достаточно. Считать файл s19 (допустим, поддерживать только кодировку ANSI для простоты), проверить его корректность, преобразовать текст в более удобное представление (структура, хранящая диапазон адресов и сами данные), считать куски бин файла в такие же структуры, правильно соединить данные в структурах между собой (когда диапазоны адресов пересекаются), записать структуры в новый файл s19.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.02.2022, 00:22   #304
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну реализовать можно практически всё что угодно. Но какого-то простого и компактного способа я не вижу. Если не пытаться написать сразу суперуниверсальное решение, которое обрабатывает гигабайтные файлы, а что-то более простое, то все равно работы достаточно. Считать файл s19 (допустим, поддерживать только кодировку ANSI для простоты), проверить его корректность, преобразовать текст в более удобное представление (структура, хранящая диапазон адресов и сами данные), считать куски бин файла в такие же структуры, правильно соединить данные в структурах между собой (когда диапазоны адресов пересекаются), записать структуры в новый файл s19.
Да эта целая операция по пересадке сердца.... Я думал что всё проще, а тут такая засада получается, один кусок в bin, вставить в s19 и сохранить. Мне пришла в голову идея, а если файл s19 держать в папке с программой, тогда загрузить надо будет только один bin файл и сохранить . Такое вроде реально, сейчас читаю по этому способу материал.
Но что так трудно будет и не подумал. Вот засада... А если при загрузке файл s19 переводить в bin , тут же загрузить кусок бина, соединить и сохранить в S19 ? С этими текстовыми файлами, одни заморочки получаются, по сравнению с bin, где всё проще.
sergey.serg-72 вне форума Ответить с цитированием
Старый 19.02.2022, 00:40   #305
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Не пойму, как хранение s19 в папке с программой может помочь уйти от проблемы разбора текстового файла, чтобы понять, что за бинарные данные в нем представлены.
Да это факт не как не уйти от проблемы разбора текстового файла .
sergey.serg-72 вне форума Ответить с цитированием
Старый 20.02.2022, 02:31   #307
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Простая тестилка диапазонов:
Код:
procedure TForm1.btn1Click(Sender: TObject);
const
ranges: array[0..7] of array[0..2] of Integer = (
($0000, $06C0, $800),
($0870, $1F20, $900),
($1080, $3A90, $1020),
($3DD0, $42C0, $1500),
($4C60, $58E0, $1800),
($6030, $73C0, $1860),
($0BAE0, $BF60, $1920),
($0E800, $FFFF, $2000)
);
var
i, j, offset_i, offset_j: integer;
begin
with mmo1 do
begin
Clear;
Lines.BeginUpdate;
for i := Low(ranges) to High(ranges) do
begin
offset_i := ranges[i, 2] - ranges[i, 0];
for j := i + 1 to High(ranges) do
begin
offset_j := ranges[j, 2] - ranges[j, 0];
if (ranges[i, 1] > ranges[j, 0]) and (ranges[i, 0] < ranges[j, 1]) then
Lines.Add(Format('old %d intersects old %d', [i, j]));
if (ranges[i, 1] > ranges[j, 0] + offset_j) and (ranges[i, 0] < ranges[j, 1] + offset_j) then
Lines.Add(Format('old %d intersects new %d', [i, j]));
if (ranges[i, 1] + offset_i > ranges[j, 0]) and (ranges[i, 0] + offset_i < ranges[j, 1]) then
Lines.Add(Format('new %d intersects old %d', [i, j]));
if (ranges[i, 1] + offset_i > ranges[j, 0] + offset_j) and (ranges[i, 0] + offset_i < ranges[j, 1] + offset_j) then
Lines.Add(Format('new %d intersects new %d', [i, j]));
end;
end;
Lines.EndUpdate;
end;
end;

И всё таки оказалось возможным, батан прислал файл, у него получилось.
И 0000 записать на начало файла, а данные с 0 адреса перенести ниже, а верхние данные заполнить 000. И главное , получилось у него ни как мы поставили условие
Код:
 if ranges5[j, 0] < fbin.Size then
fbin.Position := ranges5[j, 0]
else
Break;
if ranges5[j, 1] > fbin.Size then
Break;
fbin.Position := ranges5[j, 0];
offset := ranges5[j, 2] - ranges5[j, 0];
Если файл меньше массива , то у нас выходим из цикла.
А у него на пустые места дописываются данные до конечного адреса массива.
Если размер файла соответствует массиву то данные пишутся по своим адресам, если данных массива не хватает до конечного адреса , то пустые места заполняются 6Е,6Е,6Е....
И так , до конечного адреса массива. Если файл маленький, он увеличивается,если файл большой , то пустоты до конечного адреса массива заполняются нейтральными данными.
Таким методом не надо выходить из цикла и можно обрабатывать от маленького файла, до большого не выходя и не прерывая цикла.
И удалось заполнить верхние данные 000.
У нас не получилось, ему удалось, значит реально.
Самое оптимальное решение у него получилось, то что надо.
Тестовый файл прилагаю.
Вложения
Тип файла: rar Тестовый.rar (10.1 Кб, 1 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 20.02.2022, 05:33   #308
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
У нас не получилось, ему удалось, значит реально.
Просто нужно лучше формализовать задачу. В тестовом файле нет "дырок" в адресах. Это так хорошо подобраны диапазоны или пустоты между диапазонами заполнены FF?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 20.02.2022, 16:54   #309
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Просто нужно лучше формализовать задачу. В тестовом файле нет "дырок" в адресах. Это так хорошо подобраны диапазоны или пустоты между диапазонами заполнены FF?
Задача простая , в независимости от диапазонов, первый диапазон заполняется 0000, а данные переносятся ниже, на другой адрес, далее, если не хватает данных , до последних диапазонов, берётся последний байт в данных и записывается заполняя собой оставшиеся диапазоны, вот как в тестовом файле, последний байт 6E, он и заполняет собой оставшиеся диапазоны , если не хватает самих данных, а не выходит из цикла. Диапазон может быть один, а файлы разной длины, один большой и перекрывает собой диапазоны, второй маленький, данных не хватает , тогда чтоб заполнить все оставшиеся диапазоны заполняются этим последним байтом. В место того, чтоб выходить из цикла. Тогда получается то что надо, любые диапазоны можно заполнять в не зависимости от размера файла. Я разве из начально не об этом говорил?, может плохо выразился, не понятно?. Но суть именно в этом, чтоб 00 заполнить первый диапазон от начала данных и далее, если не хватает данных(файл маленький) тогда берётся последний байт из данных и заполняет собой не заполненые диапазоны.
Вложения
Тип файла: rar Тестовый.rar (9.7 Кб, 1 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 28.02.2022, 00:12   #310
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Особо не тестировал. Вроде заполняет последним байтом всякие диапазоны
Теперь в массиве ranges на первом месте новый адрес, затем начало и конец диапазона из входного файла. На совести пользователя, чтобы новые диапазоны не пересекались.
Код:
procedure write_to_stream(
  ftxt: TFileStream;
  var addr: Int64;
  b: TBytes;
  var saved_count: Integer
);
const
  data_line = 'S1%.2x%.4x%s%.2x' + sLineEnd;
  ext_bytes = 3;
var
  i, count: Integer;
  sum: byte;
  data_s: string;
  s: string;
begin
  count := saved_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 saved_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));
  Inc(addr, saved_count);
  saved_count := 0;
end;

procedure TForm1.btn4Click(Sender: TObject);
const
  BYTES_IN_LINE = 16;
  file_format = 's19';
  termination_line = 'S9030000FC' + sLineEnd;
  ranges: array[0..1] of array[0..2] of Int64 = (
    ($5, $20, $30),
    ($18, $50, $70)
  );
var
  fbin, ftxt: TFileStream;
  s: string;
  b: TBytes;
  addr, range_end: Int64;
  i, j, read_count, saved_count, new_saved_count: Integer;
  last_byte: byte;
begin
  fbin := nil;
  ftxt := nil;
  try
    try
      if not dlgOpen1.Execute then
        exit;
      fbin := TFileStream.Create(dlgOpen1.FileName, fmOpenRead or fmShareDenyWrite);
      dlgSave1.Filter := Format('Motorola %s (*.%s)|*.%s|Motorola (*.srec; *.s)|*.srec; *.s', [UpperCase(file_format), file_format, file_format]);
      dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, '.' + file_format);
      dlgSave1.DefaultExt := file_format;
      if not dlgSave1.Execute then
        exit;
      ftxt := TFileStream.Create(dlgSave1.FileName, fmCreate or fmShareDenyWrite);
      SetLength(b, BYTES_IN_LINE);
      s := 'S00600004844521B' + sLineEnd;
      ftxt.Write(s[1], Length(s));
      addr := 0;
      saved_count := 0;
      last_byte := 0;
      for j := Low(ranges) to High(ranges) do
      begin
        while addr < ranges[j, 0] do
        begin
          new_saved_count := Min(BYTES_IN_LINE, ranges[j, 0] - addr);
          for i := saved_count to new_saved_count - 1 do
            b[i] := last_byte;
          saved_count := new_saved_count;
          if saved_count = BYTES_IN_LINE then
            write_to_stream(ftxt, addr, b, saved_count)
          else
            Break;
        end;
        fbin.Position := ranges[j, 1];
        range_end :=  ranges[j, 2] - ranges[j, 1] + ranges[j, 0];
        while addr < range_end do
        begin
          read_count := fbin.Read(b[saved_count], Min(BYTES_IN_LINE - saved_count, range_end - addr));
          Inc(saved_count, read_count);
          if read_count > 0 then
          begin
            last_byte := b[saved_count - 1];
            if saved_count < BYTES_IN_LINE then
              Break;
          end
          else
            Break;
          write_to_stream(ftxt, addr, b, saved_count);
        end;
        while addr < range_end do
        begin
          new_saved_count := Min(BYTES_IN_LINE, range_end - addr);
          for i := saved_count to new_saved_count - 1 do
            b[i] := last_byte;
          saved_count := new_saved_count;
          if saved_count = BYTES_IN_LINE then
            write_to_stream(ftxt, addr, b, saved_count)
          else
            Break;
        end;
      end;
      if saved_count > 0 then
        write_to_stream(ftxt, addr, b, saved_count);
      ftxt.Write(termination_line[1], Length(termination_line));
      s := 'Файл успешно преобразован и записан.';
      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 вне форума Ответить с цитированием
Ответ


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