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

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

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

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

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

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

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
можно одной строкой обойтись
Ну прямо одной вряд ли.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
какая разница с FF, или без них? на что это влияет и за чем это надо?
Предположу, что FF считается значением по умолчанию. А зачем сообщать об участках с такими значениями. И текстовый файл получается компактней.
ignore_FF_check это CheckBox, а ignore_FF и only_FF новые булевы переменные.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.01.2022, 04:07   #162
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Предположу, что FF считается значением по умолчанию. А зачем сообщать об участках с такими значениями. И текстовый файл получается компактней.
ignore_FF_check это CheckBox, а ignore_FF и only_FF новые булевы переменные.
Да, вы правы смысл есть попробовал в тритоне разные вариации, а так как формат S19 (текстовый) то проще и удобней обращаться к записи с нужного адреса, пропуская FF это заполнение пустоты как я понял. Тогда это действительно удобно и препод прав.

Далее, разобрался : ignore_FF_check это CheckBox, с этим ясно 2) а ignore_FF и only_FF новые булевы переменные с этим тоже разобрался логический тип.

var
ignore_FF,only_FF : boolean;

Но всё ровно ошибка при компиляции строки :ignore_FF := ignore_FF_check .Checked;

Не нравится компилятору и всё тут, я так делал уже, ошибка check .Checked; точка явно ошибку даёт . Что то не то.
Изображения
Тип файла: jpg 2.JPG (48.2 Кб, 14 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 19.01.2022, 04:23   #163
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Проверьте имя чекбокса.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.01.2022, 06:07   #164
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Проверьте имя чекбокса.
Ура!. Ура. Ура !!! BDA, Вы гений !
Я без очков и ошибка в имени чекбокса была, очки в унивире оставил, взял лупу и всё оккей, блин я всё правильно изначально делал, а из за слепоты, такой касяк..... Времени сколько на ерунде потерял. Но зато отработал всё с начало, по шагово , два варианта сделал. С чекбоксам и автомат.
Сваял простые s19 пока без офсета. Сейчас востановлю полную версию , благо на форуме остался материал и надо сохранить на этот раз.
Сделал автомат , если преподу не понравится с чекюоксом , значит есть автомат, как второй вариант. Выкладываю работу. И очень, очень, очень благодарю вас BDA !!!
Вложения
Тип файла: rar Converter_.rar (929.8 Кб, 1 просмотров)
Тип файла: rar Тест -3- полный с контролеой.rar (244 байт, 0 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 19.01.2022, 06:52   #165
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Чуть подумал по поводу всех FF в начале (этот код вместо предыдущего с only_FF):
Код:
  ignore_FF := ignore_FF_check.Checked;
  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);
    if ignore_FF then
    begin
      first_non_FF := -1;
      for i := 0 to read_count - 1 do
        if b[i] <> $FF then
        begin
          first_non_FF := i;
          Break;
        end;
      if first_non_FF = -1 then
        Continue
      else
      begin
        ignore_FF := False;
        if first_non_FF <> 0 then
        begin
          fbin.Position := fbin.Position - read_count + first_non_FF;
          Continue;
        end;
      end;
    end;
Теперь будут игнорироваться все начальные FF. Не знаю, можно ли упростить. И два момента: прогрессбар из-за перечитывания может "убежать" вперед (хотя, вряд ли это как-то помешает пользователю), адреса в полученном srec файле могут быть не кратны длине строки (ну тут надо решить, что важнее: отбросить максимум FF или сохранить красивые адреса).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 20.01.2022, 01:51   #166
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Но таким образом будут проигнорированы не все начальные FF, а только начальные FF, чье общее количество кратно BYTES_IN_LINE. Т.е. могут остаться несколько FF из начала, если они влезли в начало следующей строки.
BDA здравствуйте ! Всё правильно так и должно быть , потому что могут быть значения в строке, в конце. И редакторы так делают, значит всё правильно.

Цитата:
Сообщение от BDA Посмотреть сообщение
Теперь будут игнорироваться все начальные FF. Не знаю, можно ли упростить. И два момента: прогрессбар из-за перечитывания может "убежать" вперед (хотя, вряд ли это как-то помешает пользователю), адреса в полученном srec файле могут быть не кратны длине строки (ну тут надо решить, что важнее: отбросить максимум FF или сохранить красивые адреса).
Не знаю как насчёт упростить, но я вчера как чуял что препод и с 00 может тоже дать задание.
Так оно и вышло , дал и 00 добавить , хотя многие так ещё и с FF не сделали.
Я вчера такой вариант предположил и по этому у меня вчера, уже был вариант и с 00 и с FF и с обоими сразу. Очень ему понравился вариант автоматом, он секрет так и не понял в чём.
Я не просто отработал варианты и с 00 и FF и вместе . Я сразу. на опережение и по Hex и по S19 сделал. Знаю что потом препод потребует, по этому сразу сегодня отработал вариант.
Надо было вспомнить наши уроки и пройти всё за ново. Написал конверт , правда ограничил до 65536 байт. Как учебное пособие. В теме есть все варианты и при необходимости можно сделать полные варианты. А мне надо было вспомнить наши уроки и я от простого. к сложному.

(адреса в полученном srec файле могут быть не кратны длине строки (ну тут надо решить,) вот это плохой вариант. лучше чтоб всё корректно. Старый код корректен. Просто доработал чуток и для FF и для 00. Всё отлично и корректно. А прогресс бар это не заметно, пользователю.

код для доработки :
Код:
ignore_FF,only_FF,only_00  : boolean;

only_FF := True; 
only_00 := True;


only_FF := only_FF and (b[i] = $FF);
only_00 := only_00 and (b[i] = $00);


if ignore_FF  then
if (only_FF) or (only_00 ) then     
Continue
else
ignore_FF := False;
И мой вариант с небольшим изменением.

Последний раз редактировалось BDA; 22.01.2022 в 06:45. Причина: удаление exe
sergey.serg-72 вне форума Ответить с цитированием
Старый 20.01.2022, 02:42   #167
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
лучше чтоб всё корректно
Может быть каким-то программам и важны кратные адреса, но в той же википедии ничего нет про то, что адреса обязаны быть выровнены, так что всё корректно в любом случае.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 20.01.2022, 03:42   #168
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

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

В архиве прошивы (кстате правильно не должен убирать FF . если в конце строки есть данные) здесь всё отлично, Вы правы оказались. Но я в конверте сделал убираю всё.
В архиве с имитированные прошивы и новый конвертер, посмотрите пожалуйста, протести его.
Всё. вроде отлично, один, в один с тритоном. А вот по 00 нет, нигде инфы и объяснения, почему 00 не трогаются. Конечно , можно убрать, но в чём фишка и то и это просто заполнение пустых мест, почему 00 не трогаются ?

Вот проверяйте дополнил и одну ошибку исправил из предыдущей версии . а джонс не заметил её.

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Не пойму прикола? Вот я сделал в конверторе как в редакторах и из середины убирает и FF и 00 . сравнил с тритоном отлично всё. Конечно можно убрать 00. но в чём прикол не пойму?
Покумекал и исправил теперь есть выбор хочешь FF, хочешь 00, выбор за пользователем.
Инфы нигде нет. так что пусть по желанию пользователя будет на выбор.
Но получилось отлично и вверху убирает и в середине . чистые данные .

Это финальная версия её тестить лучше.

Последний раз редактировалось BDA; 22.01.2022 в 06:48. Причина: удаление exe
sergey.serg-72 вне форума Ответить с цитированием
Старый 20.01.2022, 06:56   #169
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
только FF касается, если 00 то не трогают не вверху. не внизу. В чём прикол не пойму, описания нет.
Особо не гуглил, но вот, например, Why do most of the non-volatile memories have logical 1 as the default state?. То есть стертая память имеет значение FF. Поэтому и нет смысла хранить в srec файле FF - они в памяти и так будут.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
хочешь FF, хочешь 00, выбор за пользователем
Да, лучше с выбором. Если все-таки дефолтным значением будет 00. Убирать и то и другое нельзя одновременно.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
её тестить лучше.
Не запускаю чужих exe Лучше итоговый вариант кодом.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 21.01.2022, 01:10   #170
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Особо не гуглил, но вот, например, Why do most of the non-volatile memories have logical 1 as the default state?. То есть стертая память имеет значение FF. Поэтому и нет смысла хранить в srec файле FF - они в памяти и так будут.
BDA здравствуйте ! сегодня с технорями с соседнего потока разговаривал. Да, считается что по умолчанию пустая микросхема в 90% случаев имеет заполнение из FF, но бывают микроконтроллеры и микросхемы (новые имеется ввиду) где заполнение из 00, нет общего стандарта для всех, по этому и так бывает и так. Редакторы перестраховываются и 00 игнорят, от греха по дальше. Что тоже, не совсем правильно . Технарь дал прошивы считанные с разных микросхем и микроконтроллеров с чистых считал и там заполнения из 00. Чтобы записать нужные данные (они как правило меньше физической памяти) приходится зашивать прошиву целиком с 00, как он мне объяснил, бывают большая память и файл получается огромный, приходится с 0 адреса по 6000 (где должны быть сами данные) файл с 000 заполнение и что это не удобно. Он сказал что в таких случаях , открывает в блокноте файл, выделяет область с 00 , до адреса данных 6000 и ненужное вырезает, а потом просто пересохраняет и файл готов.
Я даже не думал, что так можно делать, попробовал и правда можно и всё корректно получается. Правду говорят, век живи, век учись!. Так вот, сами технари сказали, чтоб была обязательно возможность и 000 с начало адреса хотя бы убирать ..
Что касается середины, то тут как объяснили, есть зона под флэш, еепром и какие то опционные байты, настройки. Если они разделены между собой 00 , или FF то их смело можно убирать, файл будет меньше. Но если нули стоят в самой прошивки, то их, нельзя трогать, а то контролка не совпадёт , ведь 00 это 0, а FF, это 255. И опять, тут зависит от того. что прописано в микросхеме, если там 00 , то можно и из прошивы убирать, если там FF, то нельзя. Бывает повреждены данные и на место 00, прописались FF, тогда надо перезаписывать полностью.
В общем сошлись на том, что вверху перед данными (заполнения) можно, смело обрезать, а вот в середине, или в самой прошиве, то тут лучше не делать. Но , если микросхема чистая, или в неё перед записью двнных залили 00 во всю память (так очищают иногда данные) как мне, объяснили. То можно смело. все нули обрезать для компактности файла. В общем. редакторы перестраховываются даже с верхними 00, хотя на прошивы и на данные это не влияет.
Но мы решили, что верхушку можно вырезать, если хочешь. Препод согласился с моим вариантом и зачёт. Он тоже не всё предусмотрел. Так что новый вариант с возможностью и так и так, самый оптимальный. У меня есть, чего нет в редакторах и в других конвертах.
Можно третий включить чексбокс, для игнора всех 00 , я такой вариант отработал.
Но в основную включать не стал. Остановился на самом оптимальном варианте. Дал технарям чтоб опробовали на программаторах, я сам не разбираюсь в этом. Но тесты прошла все хорошо.

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, лучше с выбором. Если все-таки дефолтным значением будет 00. Убирать и то и другое нельзя одновременно.
Учёл этот момент, при чём , если в файле идут заполнение и 00 и FF, ставим две галочки и всё ненужное вырезается (не учитывается).

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

BDA а можно две предыдущие версии удалить , там ошибки и не так как должно быть.
Чтоб не плодить 10 , а вот последней сегодняшней оставить, он оттестен и изменён.
А две предыдущие версии убрать, чтоб не вводить в заблуждение.
В архиве прошивы, сделанные в редакторе Тритон , там варианты разные и как он делает, для наглядности, ну и чтоб конверт мой проверить. Делает мой один, в один, правда 00 у меня с верху можно, при надобности игнорить. в редакторах нет.
Хотябы прошивы гляньте в архиве. Хотя вирусов нет, гарантирую, комп сегодня гонял на вирусы. архивы прогнал тоже.

код пожалуйста :
Код:
const
BYTES_IN_LINE = 16;
sLineEnd = #13#10;
var
fbin, ftxt: TFileStream;
s, data_s: string;
b: TBytes;
offset, addr: Int64;
i, count, read_count: integer;
sum: byte;
start_conv, end_conv: TDateTime;
ignore_FF,ignore_00,only_FF,only_00  : boolean;
begin
fbin := nil;
ftxt := nil;
try
try
getOffset(offset);
dlgOpen1.Filter := 'Bin (*.Bin)|*.Bin;*.bin|';
if not dlgOpen1.Execute then
exit;
fbin := TFileStream.Create(dlgOpen1.FileName, fmOpenRead or fmShareDenyWrite);
if fbin.Size - 1 > Limit16 then
raise Exception.Create('Слишком большой файл, строго до 65536 байт !');
addr := fbin.Size + offset - 1;
if addr > Limit16 then
raise Exception.Create('Слишком большой адрес конца файла!');
dlgsave1.Filter:= 'S19 File (*.S19)|*.S19';
dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName,'.s19');
if not dlgSave1.Execute then
exit;
ftxt := TFileStream.Create(dlgSave1.FileName, fmCreate or fmShareDenyWrite);
start_conv := Now;
BeforeConvert(Sender, fbin.Size div BYTES_IN_LINE);
SetLength(b, BYTES_IN_LINE);
s := 'S00600004844521B' + sLineEnd;
ftxt.Write(s[1], Length(s));
convBar.Visible:=true;
ignore_FF := ignore_FF_check.Checked;
ignore_00 := ignore_00_check.Checked;
while fbin.Position < fbin.Size do
begin
ConvBar.Position := ConvBar.Position + 1;
Application.ProcessMessages;
ignore_FF := ignore_FF_check.Checked; 
addr := fbin.Position + offset;
read_count := fbin.Read(b[0], BYTES_IN_LINE);
count := read_count +  3;
sum := count + addr and $FF + (addr shr 8) and $FF;
data_s := '';
only_FF := True;  
only_00 := True;
for i := 0 to read_count - 1 do
begin
data_s := data_s + IntToHex(b[i], 2);
only_FF := only_FF and (b[i] = $FF);
only_00 := only_00 and (b[i] = $00);//
Inc(sum, b[i]);
end;
if ignore_FF  then
if only_FF then      
Continue
else
ignore_FF := False;
if ignore_00  then
if only_00 then      
Continue
else
ignore_00 := False;
sum := $FF - sum;
s := Format('S1%.2x%.4x%s%.2x', [count, addr, data_s, sum])+ sLineEnd;
ftxt.Write(s[1], Length(s));
end;
s :='S9030000FC'+ sLineEnd;
ftxt.Write(s[1], Length(s));
AfterConvert(Sender);
end_conv := Now;
convBar.Visible:=false;
MessageBox(handle,PChar('Файл преобразован и записан в формат  s19'+#13#10), PChar('Сообщение'), 64);
except
on E : Exception do
Application.MessageBox(PAnsiChar(E.Message), 'Converter', MB_Ok + MB_ICONERROR);
end;
finally
fbin.Free;
ftxt.Free;
end;
end;
Но хотелось бы. чтоб живой опробывали. сравнили. может чего не учёл я.
Вложения
Тип файла: rar Конверт_Bin_Hex_S19_Finidh_.rar (464.5 Кб, 1 просмотров)
Тип файла: rar Тестовые Файлы для S19.rar (3.7 Кб, 1 просмотров)

Последний раз редактировалось BDA; 22.01.2022 в 06:50.
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