Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Вниз

Работа с битами и байтами 


RUS1   (2002-03-29 12:46) [0]

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

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

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

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



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

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

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



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

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



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

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



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

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



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

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



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

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 14:02) [7]


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;



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

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

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



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

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



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

Открой этот файл, например, в 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;




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.026 c
6-32932           Victor                2002-01-25 16:15  2002.04.11  
Широковещательные сообщения по сети


4-33020           GL                    2002-02-12 14:55  2002.04.11  
Кнопка Windows


1-32876           RUS1                  2002-03-29 12:46  2002.04.11  
Работа с битами и байтами


1-32742           dimonf                2002-03-29 09:39  2002.04.11  
Народ, подскажите, как мне вывести на печать TConvas Panel-и?


1-32852           Anton+                2002-03-29 08:20  2002.04.11  
Как создать удалить файл?