Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с битами и байтами [D5, Win2k]


RUS1 ©   (2002-03-29 12:46:00) 

Приветствую Вас господа!!!

Такая проблема:
Имею нетипизированный файл с массивом параметров,
каждый из которых содержится в одном 16-ти разрядном слове (один параметр занимает 2-а байта).
расшифровка слова следующая:
бит 0 признак достоверности
бит 1 и 2 признак выхода за режимные уставки
бит 3 знак переменной (положительная или отрицательная)
бит 4-15 само значение переменной впрямом коде

Вопрос как мне отдельно считать значения отдельно каждого бита в слове и проанализировать его
(типа если 0 то одно если 1 то чегото там другое)
и второе как мне из етих битов с 4 по 15 получить само значение параметра

Зарание благодарен!!!


Alx2   (2002-03-29 15:20:00) [1]

Открой этот файл, например, в FARе и посмотри что там по заданному смещению. Может 0?
Либо (на всякий случай) еще так можно попробовать:
Var F : file of word;
bytes : word;
begin
AssignFile(F,FileEdit.Text);
Reset(F);
Seek(F,32);
Read(F,bytes);
closeFile(F);
end;


RUS1   (2002-03-29 15:10:00) [2]

Как считываются биты я не знаю я ж их не вижу!!)))
А bytes после считывания равен 0!
может не работает InputFile.Read(Bytes,2);?


Alx2   (2002-03-29 14:09:00) [3]

>RUS1 (29.03.02 13:57)
Слушай, у тебя как биты считаются?
Для байта, напрмер?
У меня так :))
7 6 5 4 3 2 1 0

И еще:
Напиши чему равен этот прочитанный из файла bytes.


Alx2   (2002-03-29 14:02:00) [4]


procedure Decode(wrd : Word; Var Reliability : boolean; Var isOut, Sign : byte; Var Value : Word);
begin
Reliability := (wrd and 1) = 1; // Достоверность
isOut := (wrd and 6) shl 1; { признак выхода за режимные уставки. Здесь я так понял, что этот признак есть неразъемная двухбитовая структура}
Sign := (wrd and 8) shr 3; // Знак
Value := wrd shr 4; // собственно, значение
end;


RUS1   (2002-03-29 13:57:00) [5]

procedure TForm1.Button1Click(Sender: TObject);
var
InputFile:TFileStream;
TMPInt :Integer;
Bytes :Word;
begin

InputFile:=TFileStream.Create(FileEdit.Text,fmOpenRead);
InputFile.Seek(64,1); читаю с 64 байта типа мне так надо
InputFile.Read(Bytes,2); читаю 2 байта в переменную Bytes
TMPInt:=Bytes shr 4; получаю переменную целочисленную с четвертого бита до конца я так понял?!
ResultEdit.Text:=intToStr(TMPInt); вывод на экран
InputFile.Free;
end;

Когда ето делаю то вместо значения в результате выходит 0!


Alx2   (2002-03-29 13:46:00) [6]

Хм... А что именно не выходит?
Давай твой код посмотрим.


RUS1   (2002-03-29 13:41:00) [7]

А какой процедурой или функцией доставать из файла значение переменной wrd.
TFileStream.Read(wrd,2) подойдет? чтото у меня не выходит...:((


RUS1   (2002-03-29 13:34:00) [8]

Спасибо брат сейчас попробую...!!! )))


Alx2   (2002-03-29 13:06:00) [9]

Да, чуть не забыл :)
биты с 4..15:
value := wrd shr 4; где wrd - та самая "шифрованная" битовая структура


Alx2   (2002-03-29 12:58:00) [10]

Битовые маски можно использовать.
Например, проверка 3-го бита:
Var
Bit3 : Boolean;
wrd : Word;
begin
Bit3 := (wrd and (1 shl 3))<>0;
End;

PS
Иногда удобнее использовать asm инструкции.


Наверх

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