![]() |
| ||
|
|
Новости |
Поиск |
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;
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)
> Имеется код преобразования файла в двоичную систему и обратно.
Как это? Любой файл ничего, кроме нулей и единиц не содержит. То есть, он УЖЕ в двоичной системе. Зачем его еще преобразовывать?