Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.11;
Скачать: CL | DM;

Вниз

Работа с битами и байтами   Найти похожие ветки 

 
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;



Страницы: 1 вся ветка

Текущий архив: 2002.04.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-32734
Locked
2002-03-30 08:08
2002.04.11
Помогите пожалуйста!!!


1-32900
Neox
2002-03-29 21:26
2002.04.11
Системное Время


4-33016
Python
2002-02-12 07:40
2002.04.11
Надо получить результаты работы программы (ее вывод на консоль) запуская ее из собственной программы, наример, с помощью ShellExecuteEx


1-32774
Win32
2002-03-31 13:45
2002.04.11
Загрузку из Memo1


6-32917
eblade
2002-01-25 18:56
2002.04.11
Как отправить через TClientSocket несколько запросов подряд?