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

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

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

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

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

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

sergey.serg-72,
Приступаю к википедии по HEX, а то совсем за эти дни от главного отошёл, теперь неделя передышки есть. Сейчас почитаю и тогда наверное вопросы будут.
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.03.2021, 01:03   #52
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

sergey.serg-72,

Прочитал про hex
как я понял из прочитанного , строка в hex делится на сектора, если так можно сказать.
: так начинается строка, далее 10, количество байт (полезных) в строке, далее, Адрес, с которого начинают размещаться данные этой записи, далее ,Тип записи , если обычная строка то 00, если 02,03,04,05 это адрес сегмента, как я понимаю,это смещение ? . Если скажем адрес записи начинается с 4000, то выше будет заполнение пустотой 00, или FF. Файл с данными будет начинаться с 4000 адреса, а выше смещение с данными FF.
Далее экспериментальным путём удалось выяснить подсчёт контрольной суммы строки.

Нужно последовательно сложить все байты, так,
чтобы результат каждого сложения занимал так же один байт,
при этом переполнение не учитывается и просто отбрасывается,
— это будет операция сложения по модулю 256. Далее нужно от
256 отнять полученный байт (или можно по другому — сделать
инверсию полученного байта и увеличить результат инверсии на 1) — это будет вычисление дополнения
по модулю 256 до нуля.

Ещё особенность выяснилась, если сложить все байты в строке и к ним , прибавить байт контрольной суммы, то получится 0.
01A1 +4F=1F0 отбрасываем 1F и получаем 0. Оригинально однако.

Проще говоря ,Имеем строку из hex файла. :100000001F401F4013880C1C0702030600 0707004F
Произведем расчет контрольной суммы следующим образом.

Суммируем все символы строки по байтно (4 байта служебных и 16 байт данных).
10 +00+ 1F+40+1F+40+13+88+0C+1C+07+02+03+06 +00+07+07+00=01B1
Далее от $FFFF -01B1 = FE4E+1 =FE4F далее отбросив старшие байты, получаем сумму контрольной строки 4F. Это значит что в подсчёте контрольной суммы участвуют байты (количество данных) и байты адреса. Значит подсчёт контрольной суммы должен происходить в процессе формирования данных строки. Обрабатывается файл, раскладывается, сколько будет данных в строке, какой адрес, полная ли строка, или нет.Всё это должно учитываться.

Не думал что так муторно будет всё.... Теперь понятно, что не каждый кодер, берётся....
И не каждый сможет наверное. Тут мой оптимистичный пыл упал ниже плинтуса....

Вопрос, уточнение по SS - тип записи (00 - данные, 01 - конец файла) с этим понятно, а вот про 02,03,04 и 05 как я понял это о смещении данных идёт речь, или что то не допонял?
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.03.2021, 06:20   #53
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от sergey.serg-72
Один вариант выкладываю.
"Stream.Free;" нужно сделать до вызова "exit;". И если использовать "exit;", то нет смысла использовать тогда else ветку, а вынести весь дальнейший код на один уровень вложенности выше.
Цитата:
Сообщение от sergey.serg-72
Далее нужно от 256 отнять полученный байт
Если накапливать сумму в байтовой переменной, то последним действием можно сделать "sum := -sum;".
Цитата:
Сообщение от sergey.serg-72
Это значит что в подсчёте контрольной суммы участвуют байты (количество данных) и байты адреса.
Байты данных, количество данных, байты адреса и байт типа. Просто для типа "Данные" нет смысла прибавлять ноль. Но контрольную сумму понадобится считать и для других типов.
Цитата:
Сообщение от sergey.serg-72
как я понял это о смещении данных идёт речь
В принципе, да. Типы 03 и 05, думаю, не стоит трогать, чтобы не лезть в дебри устройства и работы процессора. А вот типы 02 и 04, возможно, придется добавлять в файл. Зависит от желаемого смещения входного bin-файла и размера этого файла. В каждой записи типа "Данные" может быть только 255 байтов информации, а адрес 16битный, поэтому без дополнительных типов можно подготовить данные только для первых 64килобайт. С типом 02 можно готовить данные для первого мегабайта. А с типом 04 - для 4 гигабайт. Возможно, преподаватель задаст какие-нибудь разумные ограничения, какие именно смещения и размеры программа должна поддерживать.
Цитата:
Сообщение от sergey.serg-72
так муторно будет всё
Именно что муторно, но не сложно. Советую прочесть про intel hex и на английской версии википедии.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.03.2021, 19:18   #54
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
"Stream.Free;" нужно сделать до вызова "exit;". И если использовать "exit;", то нет смысла использовать тогда else ветку, а вынести весь дальнейший код на один уровень вложенности выше.
Согласен, исправил.

Цитата:
Сообщение от BDA Посмотреть сообщение
Байты данных, количество данных, байты адреса и байт типа. Просто для типа "Данные" нет смысла прибавлять ноль. Но контрольную сумму понадобится считать и для других типов.
Одним словом надо считать, все данные строки , все данные входят в подсчёт.

Цитата:
Сообщение от BDA Посмотреть сообщение
В принципе, да. Типы 03 и 05, думаю, не стоит трогать, чтобы не лезть в дебри устройства и работы процессора. А вот типы 02 и 04, возможно, придется добавлять в файл. Зависит от желаемого смещения входного bin-файла и размера этого файла. В каждой записи типа "Данные" может быть только 255 байтов информации, а адрес 16битный, поэтому без дополнительных типов можно подготовить данные только для первых 64килобайт. С типом 02 можно готовить данные для первого мегабайта. А с типом 04 - для 4 гигабайт. Возможно, преподаватель задаст какие-нибудь разумные ограничения, какие именно смещения и размеры программа должна поддерживать
Да формат известен, естественно это будет Intel hex standart.
Пока сталкивались с FLESH в 98304 байта, больше не было и там как раз запись начиналась с адреса 2500 и в верху дампа FF. Вот видимо об этом и речь что смещение надо.
С гигабайтами пока дело не имели.

Цитата:
Сообщение от BDA Посмотреть сообщение
Именно что муторно, но не сложно. Советую прочесть про intel hex и на английской версии википедии.
Ну для профессионального программиста может и не сложно, а для лузеров , задача не выполнима, без чёткой инструкции в примерах. Прочесть , прочту конечно, но врятли там будет расписана реализация на Дельфи.
Я голову ломал весь день, как построить программу, весь мозг сломал....
Вижу так : 1) считываем в массив данные бинарного файла , далее записываем и адрес и данные, но не в файл, а в какой нибудь буфер , далее из буфера за ново , уже из полного файла , формируем строку в 16 байт (если полная строка) пересчитываем контрольную сумму строки, уже с адресом и проставляем контрольную сумму в конец строки, при пересчёте добавляем в данные количество байт в строке, если полная то 10, если не полная то 09, 08, 04 и.т.д
И только потом записываем в файл и сохраняем. Получается бред какой то.....
Значит делать надо сразу всё при загрузке бинарника, загрузил пересчитал количество строк, как то пересчитал адрес, далее байты в строке, контрольную сумму и так записал в файл, это как то в потоке надо делать и думаю что одним циклом не обойтись ... А скорей всего , ещё и буфер какой то дополнительный нужен.... В общем мозг ломаю, а чёткой логики сформировать не получается ...

Последний раз редактировалось BDA; 14.03.2021 в 06:32.
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.03.2021, 20:11   #55
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

sergey.serg-72,
BDA,
Ой совсем забыл спросить , ребята напомнили сегодня. Проблема заключается в следующим :
Когда обрабатываем файл из бинарного в ТХТ, как мы делали , или из bin в hex,s19 не важно.
При сохранении файла в txt формат , с начало идёт старое расширение bin, а потом идёт уже новое расширение txt. Как то не правильно, если уж мы поменяли расширение, то старое не должно присутствовать в новом файле. Действительно в редакторе попробовал: взял файл bin, сохранил в hex и в выходном файле только расширение hex, а старое расширение не приписано в файле. А у нас, как то получается не красиво на выходе, сканвертировали в новый формат, а старый присутствует в новом, выходном файле.
Как этот момент решается ? чтоб на выходе, только новое расширение, без добавления старого.
В папке два файла, один в редакторе, второй моей прогой имитация , в редакторском нет старого расширения, а в моём есть. Как бы этот момент решить.

Код при сохранении файла :
Код:
ftxt.Write(f[1],Length(f));
begin
dlgsave1.Filter:= 'hex File (*.hex)|*.hex';
dlgSave1.FileName :=dlgOpen1.FileName;
if dlgSave1. Execute() then
begin
ftxt.SaveToFile(dlgSave1.FileName+'   ' +'imitation ' +'.hex');
Application.MessageBox('hex_ файл записан  успешно.', 'Сообщение', MB_Ok + MB_ICONINFORMATION);
end;
end;
fbin.Free;
ftxt.Free;
end;
Вложения
Тип файла: rar папка.rar (674 байт, 1 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.03.2021, 23:46   #56
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
BDA,
Ой совсем забыл спросить , ребята напомнили сегодня. Проблема заключается в следующим :
Когда обрабатываем файл из бинарного в ТХТ, как мы делали , или из bin в hex,s19 не важно.
При сохранении файла в txt формат , с начало идёт старое расширение bin, а потом идёт уже новое расширение txt. Как то не правильно, если уж мы поменяли расширение, то старое не должно присутствовать в новом файле. Действительно в редакторе попробовал: взял файл bin, сохранил в hex и в выходном файле только расширение hex, а старое расширение не приписано в файле. А у нас, как то получается не красиво на выходе, сканвертировали в новый формат, а старый присутствует в новом, выходном файле.
Как этот момент решается ? чтоб на выходе, только новое расширение, без добавления старого.
В папке два файла, один в редакторе, второй моей прогой имитация , в редакторском нет старого расширения, а в моём есть. Как бы этот момент решить.

Код при сохранении файла :
Зря Вас побеспокоил по этому вопросу, нашёл функцию ChangeFileExt разобрался как удалить старое расширение .
Всё просто оказалось :
Код:
 ftxt.SaveToFile(ChangeFileExt(dlgOpen1.FileName, '.txt'));
Вопрос снят, орлам своим объяснил уже.
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.03.2021, 06:30   #57
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

На будущее, если ответов в теме не появилось, то просто дописывайте сообщение с помощью кнопки "Правка" (и другие полезные советы тут - Правила).
Цитата:
Сообщение от sergey.serg-72
но не в файл, а в какой нибудь буфер , далее из буфера за ново
Во-первых, текущий код тоже не пишет сразу из файла в файл. А сначала читает файл в поток, из потока читает кусочками в массив, из массива формируется строка, строка записывается в другой поток, а потом весь другой поток сохраняется в файл. Во-вторых, по поводу алгоритма. Чтобы поддерживать тип 04 в выходном файле (то есть в файле будут только типы 00, 01 и 04), нужно буквально добавить несколько переменных и один if, который и будет внутри цикла while в нужный момент добавлять запись 04 в выходной поток.
Цитата:
Сообщение от sergey.serg-72
Всё просто оказалось
Можно так. Или, например:
Код:
dlgsave1.Filter := 'hex File (*.hex)|*.hex';
dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, '.hex');
if dlgSave1.Execute() then
begin
  ftxt.SaveToFile(dlgSave1.FileName);
  Application.MessageBox('hex_ файл записан успешно.', 'Сообщение', MB_Ok + MB_ICONINFORMATION);
end;
Тогда пользователь сможет задать произвольное расширение при сохранении.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.03.2021, 22:03   #58
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
На будущее, если ответов в теме не появилось, то просто дописывайте сообщение с помощью кнопки "Правка" (и другие полезные советы тут - Правила).
Понял, мне казалось что правка действует несколько минут и потом нельзя уже править. Значит ошибся.

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно так. Или, например:
Код:
dlgsave1.Filter := 'hex File (*.hex)|*.hex';
dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, '.hex');
if dlgSave1.Execute() then
begin
ftxt.SaveToFile(dlgSave1.FileName);
Application.MessageBox('hex_ файл записан успешно.', 'Сообщение', MB_Ok + MB_ICONINFORMATION);
end;
Тогда пользователь сможет задать произвольное расширение при сохранении.
Как раз не надо чтоб пользователь добавлял своё расширение, а то что получится ? мы конвертируем файл из bin , в hex соответственно выходной должен быть hex и ни какой другой, а что будет, если пользователь в место hex, поставит txt , s19 , bin ? по не опытности например?
Конвертация должна быть строгой, без вмешательства пользователя, что бы избежать ошибки.
Имя захочет сменить, сменит после сохранения, переименовав файл, как ему нравится, если напартачит с расширением, то это уже его вина, а не разработчика.

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

Последний раз редактировалось BDA; 15.03.2021 в 00:13.
sergey.serg-72 вне форума Ответить с цитированием
Старый 14.03.2021, 22:38   #59
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Во-вторых, по поводу алгоритма. Чтобы поддерживать тип 04 в выходном файле (то есть в файле будут только типы 00, 01 и 04), нужно буквально добавить несколько переменных и один if, который и будет внутри цикла while в нужный момент добавлять запись 04 в выходной поток.
А как будем добавлять количество байт в строке? , или забыли про них?

У меня нет ни каких сомнений в том, что это можно сделать Вам например, или опытному программисту , у меня сомнения в себе, для меня это с ровни полёта в космос в домашних условиях.... Наш батан группы (любимец нашего препода, Джонса), два часа назад отправлен, в глубокий нокаут , заметьте не нокдаун даже , а именно в глубокий нокаут на одном ресурсе программистов... Он хотел решить эту задачу и помочь остальным сокурсникам . Помог....
Он шкодит (пардон ! кодит) с 13 лет, пришёл не лузером уже, Джонс ,его в пример всем ставит и любит его, он его любимчик !. Офигел бы увидев как его любимчика разделали в пух и прах, унизили при этом и назвали тупым...... Но объяснить ни чего так и не объяснили....
Я по сравнению с ним , что гусеница, против Аиста... Он Тайсон , можно сказать в программировании , а я школьник. Его отправили в нокаут , а Вы предлогаете мне решить эту задачу. Я бы посмеялся, бы тоже над этим. Джонс в шок ушёл бы на первой секунде!!!
Любимчик не решил, а лузер решил. Ребята создали (точней пытались создать эту тему, на разных ресурсах, темы почему то закрывали, под разными предлогами. Видимо это простая задача, с которой справится и начинающий и не стоит подробного описания и решения. Хотя запросы говорят об обратном, нет таких тем ни на одном ресурсе. Я не знаю как это объяснить?.
Я сегодня весь день читал про hex и Дельфи для начинающих (лучше бы этого не делал) , мозг закипел, в голове каша, что уяснил и запомнил всё стёр.... Вчера идеи были как цикл построить и как попробовать . После книг мозг взорвался напрочь......Забыл таблицу умножения, чего не было со мной . А после нашего Ботана, его нокаута, я совсем ниже плинтуса стёк...
У него знания как мне казалось отменные, а уделали его в первом вопросе.....

Наверное самый близкий из всех ранее кодов, к hex, ближе всего этот от ниго и плясать наверное лучше? контролку чуток скорректировал.
Но думаю с этим кодом надо работать?
Код:
  const
BYTES_IN_LINE =16;
var
fbin: TMemoryStream;
ftxt: TMemoryStream;
s,f: string;
b: TBytes;
i, count: integer;
sum : byte;
begin
dlgOpen1.Filter := ' (*.bin)|*.bin';
if dlgOpen1.Execute then
begin
fbin := TMemoryStream.Create;
ftxt := TMemoryStream.Create;
fbin.LoadFromFile(dlgOpen1.FileName);
SetLength(b, BYTES_IN_LINE);
while fbin.Position < fbin.Size do
begin
s := Format(':%.4x', [fbin.Position]);
count := fbin.Read(b[0], BYTES_IN_LINE);
sum:=0;
for i := 0 to count - 1 do
begin
s :=s+IntToHex(b[i], 2);
sum :=sum + b[i]; //или так  Inc(sum, b[i]);
end;
sum := -sum;
s :=s+IntToHex(sum, 2) + sLineBreak;
ftxt.Write(s[1], Length(s));
end;
f:=': 00000001FF'+sLineBreak;
ftxt.Write(f[1],Length(f));
begin
dlgsave1.Filter:= 'hex File (*.hex)|*.hex';
dlgSave1.FileName :=(dlgOpen1.FileName);
if dlgSave1. Execute() then
begin
ftxt.SaveToFile(ChangeFileExt(dlgOpen1.FileName, '.hex'));
Application.MessageBox('hex_файл создан успешно.', 'сообщение', MB_Ok + MB_ICONINFORMATION);
end;
end;
fbin.Free;
ftxt.Free;
end;
end;
переменные типа byte, или integer нужны будут и сколько, три , если я не ошибаюсь ?

Последний раз редактировалось sergey.serg-72; 15.03.2021 в 00:20.
sergey.serg-72 вне форума Ответить с цитированием
Старый 15.03.2021, 00:12   #60
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от sergey.serg-72
правка действует несколько минут и потом нельзя уже править
Заявлено 24 часа, но я не могу проверить, так как модераторам правка доступна всегда.
Цитата:
Сообщение от sergey.serg-72
если пользователь в место hex, поставит txt , s19 , bin ? по не опытности например?
Ничего страшного не произойдет. Неопытный пользователь, скорее всего, согласится сохранить под предложенным именем, а более опытный мог бы сразу задать нужное расширение.
Цитата:
Сообщение от sergey.serg-72
не учитывается количество байт в строке, тип записи
Но количество доступно в переменной count, а тип записи для данных всегда 00.
Код:
const
  BYTES_IN_LINE = 16;
var
  fbin: TMemoryStream;
  ftxt: TMemoryStream;
  s, data_s: string;
  b: TBytes;
  i, count, offset, high_addr, cur_high_addr: integer;
  sum: byte;
  low_addr: word;
begin
  if Edit1.Text = '' then
    offset := 0
  else
  begin
    offset := StrToIntDef('$' + Edit1.text, -1);
    if offset = -1 then
    begin
      Application.MessageBox('Введен некорректный адрес, с которого производить запись в файл!', 'Converter', MB_Ok + MB_ICONERROR);
      exit;
    end;
  end;
  with dlgOpen1 do
  begin
    Filter := 'Binary file (*.bin)|*.bin';
    if Execute then
    begin
      fbin := TMemoryStream.Create;
      ftxt := TMemoryStream.Create;
      fbin.LoadFromFile(FileName);
      if fbin.Size + offset > High(LongWord) then
      begin
        Application.MessageBox('Слишком большой адрес!', 'Converter', MB_Ok + MB_ICONERROR);
        fbin.Free;
        ftxt.Free;
        exit;
      end;
      SetLength(b, BYTES_IN_LINE);
      high_addr := -1;
      while fbin.Position < fbin.Size do
      begin
        low_addr := fbin.Position + offset;
        cur_high_addr := (fbin.Position + offset) div $10000;
        if cur_high_addr <> high_addr then
        begin
          high_addr := cur_high_addr;
          sum := 6 + high_addr mod $100 + high_addr div $100;
          sum := -sum;
          s := Format(':02000004%.4x%.2x%s', [high_addr, sum, sLineBreak]);
          ftxt.Write(s[1], Length(s));
        end;
        count := fbin.Read(b[0], BYTES_IN_LINE);
        sum := count + low_addr mod $100 + low_addr div $100;
        data_s := '';
        for i := 0 to count - 1 do
        begin
          data_s := data_s + IntToHex(b[i], 2);
          Inc(sum, b[i]);
        end;
        sum := -sum;
        s := Format(':%.2x%.4x00%s%.2x%s', [count, low_addr, data_s, sum, sLineBreak]);
        ftxt.Write(s[1], Length(s));
      end;
      s := ':00000001FF';
      ftxt.Write(s[1], Length(s));
      dlgSave1.Filter := 'Intel HEX File (*.hex)|*.hex';
      dlgSave1.FileName := ChangeFileExt(FileName, '.hex');
      if dlgSave1.Execute() then
      begin
        ftxt.SaveToFile(dlgSave1.FileName);
        Application.MessageBox('Файл успешно записан.', 'Converter', MB_Ok + MB_ICONINFORMATION);
      end;
      fbin.Free;
      ftxt.Free;
    end;
  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