Форум: "Основная";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];
ВнизКак прочитать строку побитово? Найти похожие ветки
← →
Мария В. (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c