Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2018.07.01;
Скачать: [xml.tar.bz2];

Вниз

Файл в BIN и обратно   Найти похожие ветки 

 
Sonia ©   (2016-07-01 16:08) [0]

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

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


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;



 
Юрий Зотов ©   (2016-07-01 17:12) [1]

> Sonia ©   (01.07.16 16:08)
> Имеется код преобразования файла в двоичную систему и обратно.

Как это? Любой файл ничего, кроме нулей и единиц не содержит. То есть, он УЖЕ в двоичной системе. Зачем его еще преобразовывать?


 
эээ   (2016-07-01 17:31) [2]

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

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


 
Kilkennycat ©   (2016-07-01 22:27) [3]


> Юрий Зотов ©   (01.07.16 17:12) [1]

То есть, нам удобно думать, что файл что-то содержит ;)


> Sonia ©   (01.07.16 16:08) 


вопрос озвучен неверно. равно как и тема.
Напишите более доступно и понятно,например : текстовый файл, состоящий из символов "0" и "1", которые в свою очередь являются двоичным представлением чего-то тама.
И ненужен такой громадный код, существует куча простых решений. Вот, например,охрененно шустрое табличное:
Пишем Массив строк а-ля {"0000000","00000001"..."11111111"}
ну а дальше элементарно: читаем Байт, и тут же пишем строку из Массив[ПрочитанныйБайт]


 
Kilkennycat ©   (2016-07-01 22:31) [4]

А может, Вам хочется, чтоб в каком-нить Хекс-вьювере всё выглядело а-ля 00 01 11 01 ?
Вообще, в определенных кругах есть термин, бинарник, или файл bin, но он означает всего лишь, что данный файл является прошивкой к чему-либо, не является стандартом, то есть один другому рознь.


 
megavoid ©   (2016-07-01 22:51) [5]

Ну... кому-то и такое .bin :)
Хотя, по хорошему, этой сущности на диске надо бы дать расширение .tbcb - вот, есть, например BCD, а теперь будет и [Text/Binary-Coded-Byte]. На лабораторную вполне потянет, только немного смущает TFileStream и Assign, Rewrite рядом.


 
Германн ©   (2016-07-02 00:16) [6]


>
> Sonia ©   (01.07.16 16:08)
>
> Добрый день, уважаемые!
>
> Имеется код преобразования файла в двоичную систему и обратно.
>

Сей код не имеет никакой практической полезности. Файл созданный с помощью функции StreamToBIN никому, никогда и ни для чего нафиг не нужен!


 
Dimka Maslov ©   (2016-07-03 11:55) [7]


> Сей код не имеет никакой практической полезности


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


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

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


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


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


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

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


 
Sonia ©   (2016-07-04 09:44) [10]

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

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


 
Sonia ©   (2016-07-04 09:54) [11]


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

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


> Kilkennycat ©

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


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

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


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

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


 
Sonia ©   (2016-07-04 10:05) [13]


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

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


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

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

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


 
Sonia ©   (2016-07-04 10:11) [15]


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


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


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

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


 
Sonia ©   (2016-07-04 10:21) [17]


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

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


 
Sonia ©   (2016-07-04 10:24) [18]

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


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


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


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


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

uuencode/uudecode опять же


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

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

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

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


 
Sonia ©   (2016-07-04 10:36) [22]


> dhj   (04.07.16 10:34) [21]

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


 
Sonia ©   (2016-07-04 10:37) [23]


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

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


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


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

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


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


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

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


 
Sonia ©   (2016-07-04 11:14) [26]


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


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


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

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

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

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


 
Sonia ©   (2016-07-04 11:36) [28]


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


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


 
Sha ©   (2016-07-04 11:41) [29]

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

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


 
Sonia ©   (2016-07-04 11:51) [30]


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

Это какой же?


 
Sha ©   (2016-07-04 11:53) [31]

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


 
RWolf ©   (2016-07-04 11:58) [32]


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

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


 
Sha ©   (2016-07-04 12:01) [33]

RWolf ©   (04.07.16 11:58) [32]

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


 
RWolf ©   (2016-07-04 12:11) [34]


>  [33]

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


 
Sonia ©   (2016-07-04 16:36) [35]


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


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


 
ghj   (2016-07-04 17:17) [36]

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


 
Sonia ©   (2016-07-04 17:48) [37]

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


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

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


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

Ну и вот справка, пожалуйста. Вам нужен первый вариант метода:
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-05 01:11) [40]


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

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

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


 
iop ©   (2016-07-05 08:28) [41]

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

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

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


 
han_malign ©   (2016-07-05 11:40) [42]


> Base64

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


 
Sonia ©   (2016-07-05 18:31) [43]


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

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


 
iop ©   (2016-07-05 18:48) [44]

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

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


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


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

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

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

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

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


 
Sonia ©   (2016-07-05 18:56) [46]


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


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


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


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


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

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


 
iop ©   (2016-07-05 19:02) [47]

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

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

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


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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2018.07.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.002 c
2-1467378535
Sonia
2016-07-01 16:08
2018.07.01
Файл в BIN и обратно


1-1358525546
Eraser
2013-01-18 20:12
2018.07.01
Объявление метода интерфейса с индексом


8-1242059975
noH@ker
2009-05-11 20:39
2018.07.01
О DirectSound


2-1467622935
Andrey K
2016-07-04 12:02
2018.07.01
Не ищет переменную по Ctrl левая клавиша мыши.


2-1467746107
dmk
2016-07-05 22:15
2018.07.01
TThread





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский