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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2022, 03:39   #261
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
for j := Low(ranges) to High(ranges) do
begin
  offset := ranges[j, 2] - ranges[j, 0];
  while fbin.Position < ranges[j, 1] do 
  begin
    addr := fbin.Position;
    read_count := fbin.Read(b[0], Min(BYTES_IN_LINE, ranges[j, 1] - addr));
    Inc(addr, offset);
Если так делать, то прописывать надо новый адрес третьим числом.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.02.2022, 04:14   #262
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

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

Понятно одно, что строчка - Inc(addr, ranges[j, 2]); не удлиняет файл под размер и всё тут.



Тут хоть так, хоть этак, некорректно записывает на новые адреса .

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

Цитата:
Сообщение от BDA Посмотреть сообщение
Если так делать, то прописывать надо новый адрес третьим числом.
Сделал так чтоб отследить понятней было :

Код:
 
 ranges3: array[0..7] of array[0..2] of Integer = (

    ($0000, $030, $00000),  //  на какие адреса записывать считанные куски
    ($0000, $090, $A0F0),
    ($2080, $3A90, $10000),
    ($3DD0, $42C0, $14000),
    ($4C60, $58E0, $16000),
    ($6030, $73C0, $18000),
    ($0BAE0, $BF60, $19000),
    ($0E800, $FFFF, $20000)
);


  var
fbin, ftxt: TFileStream;
s,file_format, data_line ,termination_line ,data_s: string;
b: TBytes;
 addr: Int64;
i,J, count, offset,read_count,ext_bytes : integer;
 sum: byte;



if Combobox1.ItemIndex= 3 then
begin
dlgOpen.Filter := 'Bin (*.Bin)|*.Bin;*.bin|';
if not dlgOpen.Execute then
exit;
fbin := TFileStream.Create(dlgOpen.FileName, fmOpenRead or fmShareDenyWrite);
if (fbin.Size  < 65536) or (fbin.Size > 16777216)  then
begin
ShowMessage('Не допустимый размер! .');
fbin.Free;
exit;
end;
addr := fbin.Size-1;
if addr > Limit8 then
begin
file_format := '.S28';
ext_bytes := 4;
data_line := 'S2%.2x%.6x%s%.2x'  + sLineEnd;
termination_line := 'S804000000FB' + sLineEnd;
end;
Label1.Caption := IntToStr(fbin.Size)+ ' '+ '  '+'bytes ';
dlgSave.Filter := Format('Motorola SREC File (*%s)|*%s', [file_format, file_format]);
dlgSave.FileName := ChangeFileExt(dlgOpen.FileName, file_format);
if not dlgSave.Execute then
exit;
ftxt := TFileStream.Create(dlgSave.FileName, fmCreate or fmShareDenyWrite);
SetLength(b, BYTES_IN_LINE);
s := 'S00600004844521B' + sLineEnd;
ftxt.Write(s[1], Length(s));
for j := Low(ranges3) to High(ranges3) do
begin
offset := ranges3[j, 2] - ranges3[j, 0];
while fbin.Position < ranges3[j, 1] do

begin
addr := fbin.Position;
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges3[j, 1] +1));
//Inc(addr, offset);
Inc(addr, ranges3[j, 2]);
count := read_count + ext_bytes;
sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) 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;
end;
ftxt.Write(termination_line[1], Length(termination_line));
MessageBox(handle,PChar('Файл записан !!'+#13#10), PChar('Сообщение'), 64);
fbin.Free;
ftxt.Free;
exit;
end;
end;
end;
Записывает не корректно, совсем не на те адреса, на которые задано.
Второй кусок ($0000, $090, $A0F0), не считывает и не записывает на заданный адрес и это факт !
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.02.2022, 05:47   #264
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

If'ы, которые проверяют, что диапазон входит в файл, можно убрать, а вот выставление позиции в файле надо было оставить.
Код:
for j := Low(ranges3) to High(ranges3) do
begin
  fbin.Position := ranges3[j, 0]; // это не надо было выбрасывать
  offset := ranges3[j, 2] - ranges3[j, 0];
  while fbin.Position < ranges3[j, 1] do
  begin
    addr := fbin.Position;
    read_count := fbin.Read(b[0], min(BYTES_IN_LINE, ranges3[j, 1] - addr)); // тут не + 1
    Inc(addr, offset);
"if addr > Limit8 then" - лишний.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.02.2022, 06:49   #265
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
f'ы, которые проверяют, что диапазон входит в файл, можно убрать, а вот выставление позиции в файле надо было оставить.
Код:
Понял сейчас исправлю и тестить за ново.

Вот что бы я без Вас делал ? для меня, это утопия, но стараюсь как могу.
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.02.2022, 08:07   #266
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
If'ы, которые проверяют, что диапазон входит в файл, можно убрать, а вот выставление позиции в файле надо было оставить.
Всё корректно вроде, но есть проблема, если файл меньше заявленных адресов при считывании зависает , неимоверной длины пишет файл и так, пока сброс не сделаешь....
И ограничивать не хочется размер и чтоб не висла так. Сильно виснет ....
sergey.serg-72 вне форума Ответить с цитированием
Старый 11.02.2022, 08:23   #267
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
И ограничивать не хочется размер и чтоб не висла так. Сильно виснет ....
Так не получится. Или нужно проверять диапазоны старыми условиями на то, что они находятся в файле. Или добавить проверку количества считанных из файла байтов (но тогда частично имеющийся в файле диапазон тоже будет напечатан). Или задавать изначально только такие диапазоны, которые точно будут в файле. Раз ничего из вышеперечисленного нет, то чтение уходит в бесконечный цикл со считыванием нулевого количества байтов и записью одинаковых строк в выходной файл.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.02.2022, 05:59   #268
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

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

Мне прислал батан вопрос и озадачил меня, я в ступоре чуток, он сказал что реально, я ответил что нет. Поспорили с ним. Суть вопроса в том, чтоб добавить на один из считанных адресов заполнение FF, или 00. Скажем считали мы диапазон записали на другое место, а старое место заполнили 00 скажем. Вот я озадачился возможное такое, в одном цикле, или нет? батан утверждает что можно.
Я кроме такого варианта не вижу, но он плохой вариант надо вводить Stream: TMemoryStream;
Будет ошибка.

Вот скажем диапазон :0000, $090, $A0F0), мы считали с него данные и записали на другой адрес, а вот его место там байт 100 получится ну , или больше заполнить 00 и так сохранить уже.
begin
p := Stream.Memory;
inc(p, $0);
for i := 1 to 100 do
begin
p^ := $00;
inc(p);
end;

наверное до записи где то так перед кодом этих строк чтения и записи
addr := fbin.Position;
read_count := fbin.Read (b[0], min(BYTES_IN_LINE, ranges1[j, 1]-addr ));
Но что то не получается, не нравится компилятору p := Stream.Memory;, мне она тоже не нравится, а есть ещё простой вариант, или утопия ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 12.02.2022, 09:04   #269
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Скажем считали мы диапазон записали на другое место, а старое место заполнили 00 скажем.
Да, можно. Добавить ранее упоминавшийся код перед считыванием:
Код:
for j := Low(ranges3) to High(ranges3) do
begin
  addr := ranges3[j, 0];
  while addr < ranges3[j, 1] do
  begin
    read_count := Min(BYTES_IN_LINE, ranges3[j, 1] - addr);
    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 + $FF * read_count;
    sum := $FF - sum;
    data_s := StringOfChar('F', 2 * read_count);
    s := Format(data_line, [count, addr, data_s, sum]);
    ftxt.Write(s[1], Length(s));
    Inc(addr, read_count);
  end;
  fbin.Position := ranges3[j, 0];
  offset := ranges3[j, 2] - ranges3[j, 0];
  while fbin.Position < ranges3[j, 1] do
  begin
    addr := fbin.Position;
    read_count := fbin.Read(b[0], min(BYTES_IN_LINE, ranges3[j, 1] - addr));
    Inc(addr, offset);
    ...
Несколько замечаний: этот код пишет FF (для 00 в двух строках исправить код); нужно гарантировать, что все старые и новые диапазоны между собой не пересекаются, иначе получится фигня в выходном файле (разные данные для одного и того же адреса).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.02.2022, 23:55   #270
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
data_s := StringOfChar('F', 2 * read_count);
BDA, это не совсем то , скажем что заполнения не всего файла, а определённого адреса, который задан как тут например :i nc(p, $10);
for i := 1 to 100 do
begin
p^ := $00;
inc(p);
end
Только по одному адресу , остальные игнорятся.

И вообще , есть что то подобное, адресное для TFileStream; ?
Бывает что только один адрес нужно затереть, а не всё.

И как я понял это пишет только для FF, а если для 00 нужно?
Что то универсальное бы и простое типа как выше в примере. Только для TFileStream?

Последний раз редактировалось sergey.serg-72; 13.02.2022 в 00:10.
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