Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.011 c
3-76787
Iii
2003-04-04 18:37
2003.04.24
Восстановление удаленной записи


14-77086
edicon
2003-04-06 19:26
2003.04.24
AsyncPro от TurboPower


1-76915
V-A-V
2003-04-15 06:55
2003.04.24
Вызов Help.chm из проекта


1-76902
jen_bond
2003-04-14 08:44
2003.04.24
целое число


3-76836
Vovaka
2003-04-07 10:18
2003.04.24
BDE - ошибка Insufficient memory for this operation





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский