Работа с бинарными файлами в delphi

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
Ryumka
Сообщения: 14
Зарегистрирован: 06 окт 2009, 13:26

Здравствуйте! Нужна ваша помощь.
Есть файл *.bin , данные в котором отображены в шестнадцатиричной системе (FF 02 56 и т.д.). Читаю в Delphi его как
Read(buf,100)
В этом случае при выводе на экран переменной buf получаю список десятичных чисел.
Задача стоит следующая:
отобразить данные в двоичной системе и обработать их следующим образом:
читаем первые 6 бит, переворачиваем их задом наперед и преобразовываем в десятичное число. Затем читаем следующие 3 бита (без пробелов), переворачиваем и преобразовываем в десятичное. И т.д. и т.п.
Не могу найти соответствующей литературы. Не могу занести buf в массив. (Да и к тому же я полный, так сказать, новичок).
Помогите, кто чем сможет :)
Заранее благодарна.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Для этой задачи необходимо выделить буффер Buf, создать функцию переворода битов, ввести переменную для текущей битовой позиции и собственно саму файловую переменную

Код: Выделить всё

var
buf   : PByteArray;
bpos : Integer;
bsize  :Integer;
F      : File;

function ReverseBits(bits:Byte):Byte;  // переворот битов
begin
result := 0; // в начале пусто
While bits <> 0 do
    begin
    result := (result or (bits and 1 shl 7)) shr 1; // выделяем младший бит и делаем старшим в результате
    bits := bits shr 1; // переход к следущему биту
    end;
end;

procedure Process;
var fname:String;
     p, c : Integer;
     bits6, bits3:Integer;
begin
fname := 'C:\FTP\Upload\Friends\Janny\nudephoto.bin'; // типа файл там
If not FileExists(fname) then exit; // если нет, то выход
AssignFile(F, fname); 
Reset(F, 1);
If FileSize(F) = 0 then begin; CloseFile(F); exit; end; // если пусто, то выход
bSize := FileSize(F);
bPos := 0;
GetMem(Buf, bSize); // выделяем память буфферу
Blockread(F, Buf[0], bsize);  // читаем весь файл туда

repeat

p := bPos shr 3;  // номер байта = номер бита / 8
c := bPos and 7; // стартовая позиция кусочков битов в нем = номер бита mod 8
Bits6 := (PWord(@Buf[p])^ shr C) and $3F; // классика BitFuck :) попробуйте сами понять
Bits3 := (PWord(@Buf[p])^ shr (C+6)) and 7; // Pword интерпретирует указатель на буффер, как указатель на 2 байта.
Bits6 := ReverseBits(bits6); // переворот
Bits3 := ReverseBits(bits3);
inc(bPos, 9); // обработали 9 битов, идем дальше

until p-1>=bSize; // до конца буффера.
FreeMem(Buf); // освободить, закрыть и уйти.
CloseFile(F);
end;
It's a long way to the top if you wanna rock'n'roll
Ryumka
Сообщения: 14
Зарегистрирован: 06 окт 2009, 13:26

Большое спасибо! Буду пробовать и разбираться! :)
Ответить