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

Вниз

Как прочитать строку побитово?   Найти похожие ветки 

 
Мария В.   (2003-04-14 11:35) [0]

В строку считывается TBlobField. Как потом прочитать строку по битам.
Заранее спасибо.


 
Skier ©   (2003-04-14 11:38) [1]


> В строку считывается TBlobField.

???!!! А зачем сие ? Зачем именно в строку ?


 
Мария В.   (2003-04-14 12:08) [2]

Строка используется как битовый массив. Считаете, что лучше по-другому - напишите как.


 
Digitman ©   (2003-04-14 12:09) [3]

По битам, говоришь ? Вынужден огорчить : меньше байта - никак)


 
Palladin ©   (2003-04-14 12:10) [4]

прошу уточнить
битовый или байтовый? :)

строка как битовый массив крайне неудобна...


 
Skier ©   (2003-04-14 12:15) [5]

>Мария В.

> Считаете, что лучше по-другому - напишите как.

Нет. Давай всё-таки разберёмся зачем...Расскажи по-подробнее...
Может быть есть более "красивый" выход...


 
Anatoly Podgoretsky ©   (2003-04-14 12:17) [6]

Раз строка то можно обратиться по индексу и привести к байту, а вот здесь уже можно манипулироваться отдельными битами.


 
Palladin ©   (2003-04-14 12:18) [7]


> Digitman © (14.04.03 12:09)

почему?

function _Bit(s:string;num:integer):boolean;
begin
if length(s)<(num div 8) then result:=false
else result:=(ord(s[num div 8]) or rol(1,num mod 8))=ord(s[num div 8]);
end;

если не ошибаюсь


 
Anatoly Podgoretsky ©   (2003-04-14 12:22) [8]

num div 8, num < 8, s[num div 8]) имеем неприятность.


 
REA ©   (2003-04-14 12:24) [9]

TBits еще


 
Palladin ©   (2003-04-14 12:30) [10]

извиняюсь...
это была демо версия функции доступа к битам :)


 
Digitman ©   (2003-04-14 12:31) [11]


> Palladin


Почему ? Потому что размер reg/mem-операнда маш.инструкции кратен байту


 
Palladin ©   (2003-04-14 12:40) [12]


> Digitman © (14.04.03 12:31)

мы с Вами несколько по разному интерпретируем слово "массив"

естественно Вы правы рассматривая термин "массив" применительно к программированию


 
Digitman ©   (2003-04-14 12:59) [13]


> Palladin


а как же иначе, если не "применительно к программированию" ?

"применительно к программированию" и вопрос автора должен был бы совершенно по-иному прозвучать !


 
Мария В.   (2003-04-14 13:35) [14]

TBits пробовала. Допустим S:String, M:TBits: пишем M := TBits(S)получаем M.Size = 0. Что-то я не то делаю, наверное.
Задачу уже описывала в конференции по базам, так что Sorry за повтор. В таблице в поле Blob (subtype 0) храниться битовая маска. Задача такая: есть набор CheckBox-ов (RxCheckListBox), нужно прочитать битовую маску из Blob и соответственно отметить CheckBox-ы (если 00000101, то 1-й и 3-й CheckBox отмечены и т.д.).
Авторство проги и базы не моё. Приходится дописывать кусок к чужой системе. Хозяева крайне нелюбезны, но посоветовали читать Blob в строку, а потом дословно:
"Мы используем строку как битовый массив. Для битовых операций в Паскале существуют операторы AND, OR, XOR, SHL, SHR."
Все всё поняли? Я -нет.



 
Palladin ©   (2003-04-14 13:43) [15]


> Digitman © (14.04.03 12:59)

v:byte;

на уровне проектирования мы будем рассматривать v - как битовый массив, на уровне реализации естественно мы будем работать со всеми получаемыми значениями как c байтовыми...

в любом случае автору вопроса нужно было узнать как получить значение конкретного бита в string...
а в каком виде его получить byte word dword указано не было...


> Мария В. (14.04.03 12:08)

вместо string лучше использовать array of byte


 
Palladin ©   (2003-04-14 13:52) [16]


function _BitAsBoolean(const BA:array of byte;p_nBitNum:integer):boolean;
begin
if (High(BA)<(p_nBitNum div 8)) or (p_nBitNum<0)
then raise Exception.Create("_BitAsBoolean")
else result:=(BA[p_nBitNum div 8] or rol(1,p_nBitNum mod 8))=BA[p_nBitNum div 8];
end;


не тестировал


 
Anatoly Podgoretsky ©   (2003-04-14 13:53) [17]

Мария В. (14.04.03 13:35)
"Мы используем строку как битовый массив. Для битовых операций в Паскале существуют операторы AND, OR, XOR, SHL, SHR."

Anatoly Podgoretsky © (14.04.03 12:17)
Palladin © (14.04.03 12:18) с поправкой на ошибку индекса, индекс должен быть вычислен так
Ind := num div 8 + 1
а номер вита
NumBit := num mod 8


 
Digitman ©   (2003-04-14 13:54) [18]


> Мария В


покажи фрагмент кода, где из blob-поля у тебя считываются данные (в дан.случае - в переменную стр.типа)


 
Мария В.   (2003-04-14 14:08) [19]

Имя_Blob.AsString
Так делают хозяева. Можно через TBlobStream в PChar, а потом в строку - результат тот же.


 
Digitman ©   (2003-04-14 14:25) [20]

BA: PByteArray;
BS: TBlobStream;
StreamSize, BytesRead: Integer;
...

StreamSize := BS.Size;
GetMem(BA, StreamSize);
try
TotalBytes := BS.Read(BA^, StreamSize);

.. дальше работаем с байтовым массивом BA размером в TotalBytes байт
.. с использованием битовых операций и сдвига
finally
FreeMem(BA);
end;



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

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

Наверх




Память: 0.51 MB
Время: 0.012 c
14-77113
gek
2003-04-07 21:33
2003.04.24
Вопрос про память


8-77032
Axis_of_Evil
2003-01-15 11:54
2003.04.24
Cursor


1-76967
Rus
2003-04-11 10:41
2003.04.24
Прога, скомпилированная в D6 не запускается в Win95


1-76944
balykovdron
2003-04-12 12:15
2003.04.24
Помогите новичку вызвать поток.


8-77037
atmospheric
2003-01-04 18:20
2003.04.24
wave разобрать по частом...