![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Файл в BIN и обратно [D5]
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]
> То есть, нам удобно думать, что файл что-то содержит ;)
Именно так, нам просто удобно. На самом же деле содержит не сам файл, а ассоциированный с ним физический набор данных.