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;


iop   (2016-07-05 19:02:00) [1]

1. двоичный формат и xml несовместимы.
сообщите это заказчику.

1. твой формат "1 бит растягиваем в байт" не двоичный, а текстовый.

Вопрос состоял в том, как оптимизировать алгоритм преобразования в двоичный формат! (заказчик просил именно в двоичном формате!), а не заменить его другими!


миллион раз уже сказали как.


Sonia   (2016-07-05 18:56:00) [2]


> iop ©   (05.07.16 18:48) [44]


> 2. кодируешь его в hex (увеличение в два раза) или base64
> (увеличение в 4/3 раза) или в свой фирменный "двоичный"
> формат (ожирение в 8 раз)


Вопрос состоял в том, как оптимизировать алгоритм преобразования в двоичный формат! (заказчик просил именно в двоичном формате!), а не заменить его другими!


> Плохиш ©   (05.07.16 18:48) [45]
>


Учту Ваши рекомендации.

Всем спасибо за ответы.


Плохиш   (2016-07-05 18:48:00) [3]


> Если я пытаюсь открыть, например, файл doc Блокнотом

doc - это фигня, картинки и exe-шки надобно блокнотом открывать.

PS. Скучная ветка. Ни о чём.

PPS. Невозможно помочь тому, кто не обладает даже начальными базовыми знаниями.

PPPS. Sonia, почитайте раздел "Орешник".


iop   (2016-07-05 18:48:00) [4]

сколько можно тупить-то?

1. берешь любой файл (в том числе двоичный и в том числе rtf)
2. кодируешь его в hex (увеличение в два раза) или base64 (увеличение в 4/3 раза) или в свой фирменный "двоичный" формат (ожирение в 8 раз)
3. засовываешь его в CDATA чтобы xml ничего там не убрал и не нормализовал
4. успокаиваешься.
5. сообщаешь той стороне какое кодирование было использовано


Sonia   (2016-07-05 18:31:00) [5]


> han_malign ©   (05.07.16 11:40) [42]
>

Простите мне мое невежество, я наверное чего-то недопонимаю. Если я пытаюсь открыть, например, файл doc Блокнотом, получаю там кракозябры, то как, простите меня, я сформирую xml файл без преобразования?? Они у меня просто туда не считаются и не запишутся (пробовала записать содерживое doc файла в Memo, записались только 3-4 кракозябры и все...). Тогда чем поможет мне раздел CDATA?


han_malign   (2016-07-05 11:40:00) [6]


> Base64

- а еще UTF7 и https://ru.wikipedia.org/wiki/CDATA


iop   (2016-07-05 08:28:00) [7]

прежде чем алгоритмы прекрасно справятся с передачей двоички по сокетам шмокетам
надо сначала эту двоичку умудриться засунуть в еённый xml

происходит запись преобразованного текста документов и их реквизитов в xml файл

что она и делает, в восемь раз увеличивая размер исходного файла


Германн   (2016-07-05 01:11:00) [8]


> Sonia ©   (04.07.16 09:44) [10]
> Требуется это
> для передачи документов между двумя системами разных разработчиков
> (обмен происходит в двоичном виде).

Любая передача документов возможна только в двух вариантах. Либо в печатном (на бумаге), либо в электронном (файл). Если выбран электронный вариант, то передать файл можно либо выложив его на FTP-сервер, либо на некий хостинг в и-нете и дав на него ссылку. Либо передать сей файл вложением в электронное письмо.
В первых двух вариантах никаких изменений документа не нужно. В третьем варианте нужно перекодировать файл дабы он не содержал специальных кодов/символов. С чем все варианты алгоритмов, указанные в [20] прекрасно справляются. Ибо для этого их и разработали!
Так что не понимаю зачем нужно изобретать велосипед.

<OFFTOP>
Возможно проблема в том, что сей файл пытаются передавать "через сокеты" . Но и тогда во-первых алгоритмы [20] прекрасно справляются, а во-вторых все имеющиеся компоненты умеют передавать не только текст.
</OFFTOP>


Плохиш   (2016-07-04 18:23:00) [9]

Ну и вот справка, пожалуйста. Вам нужен первый вариант метода:
Provides encoding for String- or Stream-based input values.

function Encode(const ASrc: string): string; overload;
function Encode(ASrcStream: TStream; const ABytes: integer = MaxInt): string; virtual; abstract; overload;

Parameters

const ASrc: string

String value to be encoded.

ASrcStream: TStream

Stream-based values to be encoded.

const ABytes: integer = MaxInt

Number of bytes in the input stream to be encoded. Default value is MaxInt.

Return Value

String - Encoded value for the input parameter(s).

Description

Encode is an overloaded String function in TIdEncoder that allows String- or Stream-based input values to be encoded. The encoded value of the input parameter is the return value for the function.

ASrc contains the un-encoded valued to be used by the function. In the Stream-based variant, ASrcStream contains the un-encoded input values. ABytes represents the number of bytes in ASrcStream to be affected by the encoding operation. When ommitted, ABytes defaults to the constant value MaxInt, and allows the function to read up to MaxInt byte values or until the end of the Stream is reached.

The Stream-based variant of Encode is a virtual function in TIdEncoder, and allows descendant classes to reimplement the function using specific encoding algorithms.

Encode is called by the class function EncodeString, when no application instance of TIdEncoder is required or available.


Плохиш   (2016-07-04 18:22:00) [10]

Что там не понятного?
https://juststrcpy.wordpress.com/2009/07/16/base64-encodingdecoding-function-for-delphi-1/


Sonia   (2016-07-04 17:48:00) [11]

Удалено модератором


ghj   (2016-07-04 17:17:00) [12]

Удалено модератором


Sonia   (2016-07-04 16:36:00) [13]


> Все эти велосипеды нужно выкинуть и заменить одним вызовом
> TIdEncoderMIME.Encode


Погуглила, не очень поняла как его применять. Можно пример?


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


>  [33]

Так-то да, если уж выкладывать на сетевой ресурс, то сам документ или его архив с сопроводиловкой — автоматически сохраняются все атрибуты, время создания/изменения файла.


Sha   (2016-07-04 12:01:00) [15]

RWolf ©   (04.07.16 11:58) [32]

Не факт, иногда гораздо проще файл положить рядом с xml, в котором есть ссылка на файл.


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


> Sonia ©   (04.07.16 11:14) [26]
> записать в xml файл текст документа

Вот это уже более правильная постановка задачи.
Все эти велосипеды нужно выкинуть и заменить одним вызовом TIdEncoderMIME.Encode, как уже советовали в [19]. Это Indy.


Sha   (2016-07-04 11:53:00) [17]

Например, тот, который [1].
Или в формате любого архиватора.


Sonia   (2016-07-04 11:51:00) [18]


> что клиент имел в виду другой двоичный формат?

Это какой же?


Sha   (2016-07-04 11:41:00) [19]

> Sonia ©   (04.07.16 11:36) [28]

А у разработчиков не было даже тени подозрений,
что клиент имел в виду другой двоичный формат?


Sonia   (2016-07-04 11:36:00) [20]


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


Надо дать корректный ответ клиенту. Для разработчиков все и так очевидно.


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

Наверх

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