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

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

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

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

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

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

Доброй ночи !
Суть задания : считать данные из файла bin и записать данные в файл txt,
чтоб в строке 16 байт данных и присвоение адреса.
Файлы от 167 байт и до больших .
Считать данные из файла получается и записать данные в файл txt,
но данные записываются в одну строку, а надо разбить на строки по 16 байт в строке и присвоить адрес данных. Не получается от слова совсем ни построчно разбить, ни присвоить адрес.
В архиве пример тест 1 как у меня выходит, а тест2 как надо.
Буду признателен за помощь.
Ни когда с подобной задачей не сталкивался.
Вот мой код считывания и записи :

Код:
 var
f: TMemoryStream;
i, j, index: integer;
s:string;
begin
dlgOpen1.Filter := ' (*.bin)|*.bin';
f := nil;
try
try
if dlgOpen1.Execute then
begin
dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, '.txt');
if dlgSave1.Execute then
begin
F:= TMemoryStream.Create;
F.LoadFromFile(dlgOpen1.FileName);
end;
begin
F .Position:=$0;
SetLength(s, F.Size);
F.Read(s[1], length(s));
for j:=0 to F.size do length(s);
end;
begin
F .Position:=$0;
s:= StrToHex(s);
F.Write(s[1],length(s));
end;
f.SaveToFile(dlgSave1.FileName);
Application.MessageBox('txt_ файл создан успешно.', 'Сообщение', MB_Ok + MB_ICONINFORMATION);
end;
except
on E: Exception do
ShowMessage('Error "' + E.ClassName + '" with message : ' + E.Message);
end;
finally
f.Free;
end;
end;
end.
Вложения
Тип файла: rar тест.rar (722 байт, 8 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 02.03.2021, 09:14   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

правильнее всего считать файл(bin) не целиком
Цитата:
Код:
SetLength(s, F.Size);
F.Read(s[1], length(s));
а порциями по длине выводимой строки (16 байт)
желательно ДО считывания узнать(запомнить) адрес(позицию в файле) данной строки.
а теперь вывести известный адрес и известное число байт в нужном формате.
и повторить до тех пор пока есть что выводить.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 02.03.2021, 11:10   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Вообще-то для хранения бинарных данных в текстовом виде люди придумали специальный формат.
https://ru.wikipedia.org/wiki/Intel_HEX
Именно так распространяются прошивки для МК и много чего ещё. Есть даже специальные перекодировщики BinToHex.
Если это не требуется - пусть будет так, для расширения кругозора.
digitalis вне форума Ответить с цитированием
Старый 02.03.2021, 12:43   #4
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
правильнее всего считать файл(bin) не целиком

а порциями по длине выводимой строки (16 байт)
желательно ДО считывания узнать(запомнить) адрес(позицию в файле) данной строки.
а теперь вывести известный адрес и известное число байт в нужном формате.
и повторить до тех пор пока есть что выводить.

Да , Вы наверное правы я думал об этом, но в программировании ещё начинающий и мне трудно ещё воплотить в коде.
И циклом пробую, не получается пока, а примеров найти не могу. Вот и тему создал.

Цитата:
Сообщение от digitalis Посмотреть сообщение
Вообще-то для хранения бинарных данных в текстовом виде люди придумали специальный формат.
https://ru.wikipedia.org/wiki/Intel_HEX
Именно так распространяются прошивки для МК и много чего ещё. Есть даже специальные перекодировщики BinToHex.
Если это не требуется - пусть будет так, для расширения кругозора.

Да про IntelHex я знаю и мотороловский есть формат.
Но задание дали именно так, микроконтроллеры здесь не при чём.
Может преподаватель готовит на будущее , для работы с IntelHex и s19, не знаю, пока задание такое, надо сделать так. А для чего сам не понимаю. Выбирать не приходится.

Последний раз редактировалось BDA; 11.03.2021 в 00:07.
sergey.serg-72 вне форума Ответить с цитированием
Старый 02.03.2021, 13:22   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

и примите за правило для каждого действия иметь СВОЙ отдельный объект(и переменную).
(+имена переменных должны отражать назначение объектов)
в данном случае
--чтение исходного файла
--вывод текста "преобразованного" файла
Код:
var
fbin: TMemoryStream; // исходный файл bin
ftxt: TMemoryStream; // файл вывода текста
в таком случае вывод данных НЕ БУДЕТ мешать читать исходный файл.

Код:
while fbin.position <fbin.Size do begin
  a:=fbin.position;
  fbin.Read(s, 16);
  r:=format('%x: %s'#13#10, [a, strtohex(s)]);
  ftxt.Write(r);
end;
код не проверял.
просто иллюстрация к вышеизложенному.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось BDA; 11.03.2021 в 00:08.
evg_m на форуме Ответить с цитированием
Старый 02.03.2021, 14:47   #6
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
и примите за правило для каждого действия иметь СВОЙ отдельный объект(и переменную).
(+имена переменных должны отражать назначение объектов)
в данном случае
--чтение исходного файла
--вывод текста "преобразованного" файла
Код:
var
fbin: TMemoryStream; // исходный файл bin
ftxt: TMemoryStream; // файл вывода текста
в таком случае вывод данных НЕ БУДЕТ мешать читать исходный файл.


С переменными fbin: TMemoryStream;
ftxt: TMemoryStream; согласен так наверное удобней, я честно говоря, в первый раз так вижу, опыт совсем маленький.

Непонятно с переменными a и r в Вашем коде, это переменные какого типа byte , integer ?
Откуда эти переменные и какого типа.
Код не работает, ругается компилятор на переменные a и r .

Цитата:
Сообщение от evg_m Посмотреть сообщение
while fbin.position <fbin.Size do begin
a:=fbin.position;
fbin.Read(s, 16);
r:=format('%x: %s'#13#10, [a, strtohex(s)]);
ftxt.Write(r);
end;
Ругается компилятор требует актуальные параметры , не нравится ему переменные a и r

r := это переменная какого типа? и а тоже не понятно, я менял переменным и string и integer и byte не нравится ему и всё тут.
Не понятные переменные и их тип.

Последний раз редактировалось BDA; 11.03.2021 в 00:09.
sergey.serg-72 вне форума Ответить с цитированием
Старый 02.03.2021, 16:22   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Ругается компилятор требует актуальные параметры , не нравится ему переменные a и r
Цитата:
Код:
  a:=fbin.position;
а того же типа что и fbin.Position

r смотри что такое format http://www.delphibasics.ru/Format.php

Цитата:
просто иллюстрация к вышеизложенному.
ты вправе написать любой свой код как по вводу так и по выводу.
Цитата:
желательно ДО считывания узнать(запомнить) адрес(позицию в файле) данной строки.
а теперь вывести известный адрес и известное число байт в нужном формате.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 02.03.2021, 17:36   #8
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию ответ

Цитата:
Сообщение от evg_m Посмотреть сообщение
а того же типа что и fbin.Position

r смотри что такое format http://www.delphibasics.ru/Format.php


ты вправе написать любой свой код как по вводу так и по выводу.

Да, написал бы , если мог бы....

Я всё ровно не понял , ясно одно : Ваш код не работает , про формат прочитал, но это не внесло ясности, почему не компилируется и выпадает в ошибку ?

Цитата:
Сообщение от evg_m Посмотреть сообщение
ты вправе написать любой свой код как по вводу так и по выводу.
Вложения
Тип файла: rar 11111111111.rar (260 байт, 5 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 02.03.2021, 17:42   #9
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

sergey.serg-72,

Пробую циклом, но записывается только 6 байт, что то в цикле не правильно делаю , но записывать надо через цикл это уже понятно, а вот как его правильно построить , это вопрос ?

Код:
begin
F .Position:=$0;
s:= StrToHex(s);
for j:=0 to 16 do length(s);
F.Write(s[1], j);
end;
sergey.serg-72 вне форума Ответить с цитированием
Старый 02.03.2021, 21:05   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
про формат прочитал, но это не внесло ясности,
Тип результата функции format - string. Как это и было описано (но не понято ) в материале по ссылке.
digitalis вне форума Ответить с цитированием
Ответ


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