Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Файл в BIN и обратно [D5]


Страницы:   1 2 3

Sonia ©   (2016-07-01 16:08:00) 

Добрый день, уважаемые!

Имеется код преобразования файла в двоичную систему и обратно. Но работает не так быстро, как хотелось бы. Подскажите, пожалуйста, что можно сделать?


function StreamToBIN(Buf: TStream): string;
const bid : array[0..1]of char = ('0','1');
var
 i, iBit, p: integer;
 B: byte;
 s: string;
begin
 SetLength(Result, Buf.Size*8);
 p := Buf.Position;
 Buf.Position := 0;
 s := '';
 for i := 1 to Buf.Size do begin
   Buf.Read(B, 1);
   for iBit := 7 downto 0 do
     s := s + bid[(B shr iBit) and 1];
 end;
 Buf.Position := p;
 Result := s;
end;

procedure BINToStream(aStr: string; Buf: TStream);
var
 s: string;
 i,j : longint;
 ich, k: integer;
begin
 s := '';
 k := 1;
 Buf.Position := 0;
 for i := 1 to Length(aStr) div 8 do begin
   ich := 0;
   for j := 0 to 7 do begin
     ich := ich*2 + byte(aStr[k]) - byte('0');
     inc(k);
   end;
    Buf.Write(char(ich), 1);
 end;
end;

procedure TMainFormForConverting.StartConvClick(Sender: TObject);
var
 LFile: TFileStream;
 LFileRes: TextFile;
 FileUnit: string;
begin
 StatusOp.Caption := '';
 FileUnit := '';
//открыть файл в поток
 LFile := TFileStream.Create(OpenFile.FileName,fmOpenRead);
 AssignFile(LFileRes, ExtractFilePath(OpenFile.FileName) + 'ResultBIN.RTF');
 try
   DoLog('Начало операции преобразования в BIN и записи в файл: ' + DateTimeToStr(Now));
//выполнить операцию преобразования
   FileUnit := StreamToBIN(LFile);
//записать преобразованный поток в новый файл
   Rewrite(LFileRes);
   Writeln(LFileRes, FileUnit);
   DoLog('Конец операции преобразования в BIN и записи в файл: ' + DateTimeToStr(Now));
   StatusOp.Caption := 'Выполнено.';
   Application.ProcessMessages;
   CloseFile(LFileRes);
 finally
   LFile.Free;
 end;
 DoLog('---------------------------------------------------------------------------');
end;

procedure TMainFormForConverting.InverseConvClick(Sender: TObject);
var
 LFile: TextFile;
 LFileRes: TFileStream;
 FileUnit: string;
 FName:string;
begin
 StatusOp.Caption := '';
 Application.ProcessMessages;
 FName := ExtractFilePath(OpenFile.FileName) + 'InverseConvertingBIN' + ExtractFileExt(OpenFile.FileName);

 AssignFile(LFile, ExtractFilePath(OpenFile.FileName) + 'ResultBIN.RTF');
 LFileRes := TFileStream.Create(FName, fmCreate or fmOpenWrite);
 FileUnit:= '';
 try
   Reset(LFile);
   ReadLn(LFile,FileUnit);
   DoLog('Начало операции обратного преобразования из BIN и записи в файл: ' + DateTimeToStr(Now));
   BINToStream(FileUnit, LFileRes);
   DoLog('Конец операции обратного преобразования из BIN и записи в файл: ' + DateTimeToStr(Now));
   StatusOp.Caption := 'Выполнено.';
   Application.ProcessMessages;
   CloseFile(LFile);
 finally
   LFileRes.Free;
 end;
 DoLog('---------------------------------------------------------------------------');
end;


ghj   (2016-07-04 11:25:00) [21]

нужно реализовать в двоичный и сравнить быстродействие

Эта какой такой мудрый гудвин у вас задался таким вопросом?

хекс = 2символа на байт исходного
твой как бы "двоичный" = ВОСЕМЬсимволов на каждый байт исходного


Sonia   (2016-07-04 11:14:00) [22]


> RWolf ©   (04.07.16 11:00) [25]


Потому, что происходит запись преобразованного текста документов и их реквизитов в xml файл и кладется в папку экспорта, из которой другая программа их загружает себе. В первых тегах только реквизиты (их преобразовывать не надо), а вот в последнем теге содержится 16-рич.код текста самого документа (сейчас реализовано преобразование в 16-рич. формат, нужно реализовать в двоичный и сравнить быстродействие). Если это делать без преобразования, то 1) записать в xml файл текст документа не получается. 2) принимающая сторона не может загрузить себе.


RWolf   (2016-07-04 11:00:00) [23]


> Требуется это для передачи документов между двумя системами
> разных разработчиков (обмен происходит в двоичном виде).
>

И зачем тогда все эти преобразования?


Sonia   (2016-07-04 10:53:00) [24]


> Base64 - куча готовых алгоритмов/программ преобразования
> в/из

Не нашла преобразования текста в двоичный формат и обратно, подскажите, пожалуйста, название алгоритма. Прочитала, что Base64 (ну и uuencode) используется для кодирования информации для передачи по почте (в основном). Не уверена, что именно кодированием файла можно решить мою проблему, т.к. не знаю возможности принимающей программы в отношении этих функций.


Sonia   (2016-07-04 10:37:00) [25]


> Игорь Шевченко ©

Спасибо, попробую.


Sonia   (2016-07-04 10:36:00) [26]


> dhj   (04.07.16 10:34) [21]

Объясните, пожалуйста, конкретно, как в данном случае ведет себя файловый поток.


dhj   (2016-07-04 10:34:00) [27]

да, но как это отражается на быстродействии?

как-то вот так отражается:

> Но работает не так быстро, как хотелось бы.


Игорь Шевченко   (2016-07-04 10:30:00) [28]

uuencode/uudecode опять же


Игорь Шевченко   (2016-07-04 10:29:00) [29]


> Задача состоит в следующем: есть файл (как правило это текстовый:
>  doc, но могут быть и другие форматы), его нужно преобразовать
> в двоичный формат таким образом, чтобы потом при обратном
> преобразовании получить тот же файл (с картинками, текстом,
>  диаграммами и всем-всем, что в нем было). Требуется это
> для передачи документов между двумя системами разных разработчиков
> (обмен происходит в двоичном виде). Документов много, поэтому
> скорость имеет существенное значение.


Base64 - куча готовых алгоритмов/программ преобразования в/из и не надо изобретать велосипед.


Sonia   (2016-07-04 10:24:00) [30]

Куда тогда лучше накапливать?


Sonia   (2016-07-04 10:21:00) [31]


> но поток-то файловый.

да, но как это отражается на быстродействии? Не поняла причину тормозов. Он сразу в файл пишет?


ghj   (2016-07-04 10:16:00) [32]

оно в поток и формирует.
но поток-то файловый.


Sonia   (2016-07-04 10:11:00) [33]


> читай/пиши файл блоками а не по байту за раз.


То есть, когда написано Buf.Read(B, 1);или Buf.Write(char(ich), 1);он все время к файлу на диске обращается?
Я честно говоря думала, что он сначала поток формирует.


ghj   (2016-07-04 10:06:00) [34]

а вот твоих два тормоза:

Buf.Read(B, 1);
Buf.Write(char(ich), 1);


Sonia   (2016-07-04 10:05:00) [35]


> Как выглядеть будет не важно. Можно даже подряд все.

Имелось в виду "0000000","00000001"..."11111111" только подряд


ghj   (2016-07-04 10:02:00) [36]

по-русски это называется сделать из двоичногофайла файл текстовый


Sonia   (2016-07-04 09:54:00) [37]


> только немного смущает TFileStream и Assign, Rewrite рядом

А чем смущает? некорректно написано?


> Kilkennycat ©

Как выглядеть будет не важно. Можно даже подряд все.


>  существует куча простых решений. Вот, например,охрененно
> шустрое табличное:

Хорошая идея, надо попробовать.


Sonia   (2016-07-04 09:44:00) [38]

Извините за неточности, допущенные в описании задачи и темы и спасибо всем за ответы.

Поясню: программа не для обучения (не лабораторная).
Задача состоит в следующем: есть файл (как правило это текстовый: doc, но могут быть и другие форматы), его нужно преобразовать в двоичный формат таким образом, чтобы потом при обратном преобразовании получить тот же файл (с картинками, текстом, диаграммами и всем-всем, что в нем было). Требуется это для передачи документов между двумя системами разных разработчиков (обмен происходит в двоичном виде). Документов много, поэтому скорость имеет существенное значение.


Германн   (2016-07-04 00:32:00) [39]


> Dimka Maslov ©   (03.07.16 11:55) [7]
>
>
> > Сей код не имеет никакой практической полезности
>
>
> В целях обучения принципам работы с разными кодировками
> - имеет. Даже для развития зрительной памяти и внимания
> на последвательнсти цифр - имеет.

Не понял при чем тут "кодировки". Но в любом случае в "целях обучения" можно было бы придумать задания более подходящие нежели преобразование бинарного файла в текстовый с непрерывной последовательностью символов 0 и 1.


Юрий Зотов   (2016-07-03 14:44:00) [40]

> Kilkennycat ©   (01.07.16 22:27) [3]
> То есть, нам удобно думать, что файл что-то содержит ;)


Именно так, нам просто удобно. На самом же деле содержит не сам файл, а ассоциированный с ним физический набор данных.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо