Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа с файлами


Автор: Dedal 6.5.2004, 00:26
Вопрос такой. Может кто подскажет. Надо открыть файл BMP. С этим-то проблем нет. Но как, допустим, в 2000-м(или любом другом) байте младший бит обнулить? Сделать это надо наложением маски вида 11111110 путем логического умножения.

Автор: p0s0l 6.5.2004, 14:32
Код
var
 f : file;
 b : byte;
begin
 AssignFile(f, 'c:\111.bmp');
 Reset(f, 1);
 Seek(f, 2000);
 BlockRead(f, b, SizeOf(b));
 Seek(f, 2000);
 b := b and $FE;
 BlockWrite(f, b, SizeOf(b));
 CloseFile(f);
end;


Автор: Crane 9.4.2005, 16:54
Можно ли файл читать по битно, получается геморно раскладывать считанный байт на биты для послудующего их изменения, нужно весь файл перебрать побитно для применения хитрого скремблера к каждому прочитанному биту. Должен же быть способ через функции MS-DOS, или со вставками на ассемблере или еще как, но должно же быть решение подскажите!

Автор: Snowy 11.4.2005, 08:49
Цитата(Crane @ 9.4.2005, 16:54)
Можно ли файл читать по битно

Нет. Операционная система позволяет читать только блоками, размер которых указывается в байтах.
Соответственно минимальная единица считываемой информации = 1 байт.
Но оптимально читать большими блоками (лучше сразу весь файл) и работать с байтами уже в памяти.

Добавлено @ 08:54
Кроме того нет типа данных для хранения одного бита. Все равно вся работа идет минимум с байтом.

Автор: EKoshelev 14.4.2005, 09:33
p0s0l, глядя на твой код мне почему-то кажется что после всех дел, которые ты там описал файл станет длиной 2000 б. Хотя я на 100% не уверен. А ты уверен, что он останется прежней длины???

Автор: Snowy 14.4.2005, 11:26
Файл останентся той длины, которой был, если до этого он был длиннее, чем 2000.
Задача стояла - изменить 2000-й байт.

Автор: Dr.No_xXx 14.4.2005, 13:54
Как вариант мона сделать так.В каждом байте хранится 8 бит.То есть в этих 8 битах хранится код байта.Мона впринципе,при знании кодов,просто выводить инфу в битах.

Автор: Snowy 14.4.2005, 15:20
Цитата(Dr @ 14.4.2005, 13:54)
Мона впринципе,при знании кодов,просто выводить инфу в битах.

Куда выводить? Зачем??
Человеку нужно изменить один или несколько бит в файле.
Тут только один путь - цитаешь нужный байт, меняешь в нем нужный бит и пишешь его назад.

Автор: Dimannn 15.4.2005, 10:05
Попробуй так
Код

Type Bit= ^Boolean;

procedure TForm1.Button1Click(Sender: TObject);
Var H1,h2: THandle;
    Base, P: Bit;
begin
H1:=FileOpen('filename',fmOpenReadWrite);
h2:=CreateFileMapping(H1,nil,0,0,0,nil);
Base:=MapViewOfFile(h2,PAGE_READWRITE,0,0,0);
P:=Base;

P:=Pointer(Integer(P)+SizeOf(Boolean)*2332) //Доступ к биту № 2332
P^:=not(P^);  //Инвертирование бита

UnmapViewOfFile(Base);
CloseHandle(h2);
CloseHandle(H1);
end;

Автор: <Spawn> 15.4.2005, 11:38
Dimannn Зачем такие извращения? И при чем тут изменение байт(Boolean имеет размер 1 байта, а не бита!!!!)? Уже все давно распиали. Зачем постить код, не имея представления о том, что он делает?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)