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;


Dimka Maslov   (2016-07-03 11:55:00) [41]


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


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


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


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

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


megavoid   (2016-07-01 22:51:00) [43]

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


Kilkennycat   (2016-07-01 22:31:00) [44]

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


Kilkennycat   (2016-07-01 22:27:00) [45]


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

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


> Sonia ©   (01.07.16 16:08) 


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


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

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

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


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

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

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


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

Наверх

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