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

Вниз

Как засунуть Set в строку   Найти похожие ветки 

 
salexn   (2006-10-03 14:29) [0]

Есть set of byte. Нужно запихнуть ег в строку. Можно конечно тупо пробежаться по всему set и если присутствует, добавить в строку. Но ведь можно как-то через MOVE это сделать. А как - не в курсе.


 
Palladin ©   (2006-10-03 14:31) [1]

Set не есть набор значений и Move к нему в данном случае неприменим


 
Сергей М. ©   (2006-10-03 14:31) [2]


> Нужно запихнуть ег в строку


И обязательно "запихнуть" ?
Тогда подробнее, про "пихание" ..

ПРиводи исх код и содержимое результ. строки ...


 
salexn   (2006-10-03 14:33) [3]

>Palladin

т.е. только через перебор? Вот так
var
 i: byte;
begin
 S := "";
for i := 1 to 255 do
 if i in aSetOfByte then
   S := S + chr(i);
end;


 
Reindeer Moss Eater ©   (2006-10-03 14:33) [4]

set это 32 байта.
Каждый бит отчечает за вхождение элемента в множество.
так что никакой Move здесь не прокатит.


 
Германн ©   (2006-10-03 14:52) [5]


> так что никакой Move здесь не прокатит.
>

Ну зачем уж так категорично.
Знать бы только зачем и что на самом деле хочет автор?


 
oxffff ©   (2006-10-03 14:55) [6]

Сейчас поможем засунуть/запихнуть. :)


 
Reindeer Moss Eater ©   (2006-10-03 14:55) [7]

>Знать бы только зачем и что на самом деле хочет автор?

Для этого достаточно прочитать его вопрос.
Он хочет байты сета (в котором нет самих байтов, а только битовые флаги) замувить в строку.
Поэтому вот так категорично.


 
oxffff ©   (2006-10-03 14:58) [8]


> Reindeer Moss Eater ©   (03.10.06 14:33) [4]
> set это 32 байта.
> Каждый бит отчечает за вхождение элемента в множество.
> так что никакой Move здесь не прокатит.


Set занимает до 32 байт.
Размер вычисляется как  (Max div 8) - (Min div 8) + 1


 
oxffff ©   (2006-10-03 15:01) [9]

>Знать бы только зачем и что на самом деле хочет автор?

Он хочет запихнуть. :)


 
salexn   (2006-10-03 15:04) [10]

Хотелось бы хранить разрешенные пользователю действия. Т.е. для каждого дейсвия есть свой id от 1 до 255. Все что разрешено записывается в AllowedOperation типа set of byte. В БД хранится как строка. Соответственно нужно строку преобразовать в set of byte и обратно.


 
oxffff ©   (2006-10-03 15:07) [11]

Так может в базе поменять поле на blob? И хранить свои 32 байта


 
Palladin ©   (2006-10-03 15:09) [12]

var
set_as_is:Set of Byte;
set_as_integer:Integer absolute set_as_is;

...
s:=IntToStr(set_as_integer);


 
oxffff ©   (2006-10-03 15:12) [13]

Palladin ©   (03.10.06 15:09) [12]

Скорее исправь. Set оf byte. Занимает 32 байта


 
oxffff ©   (2006-10-03 15:15) [14]

Palladin ©   (03.10.06 15:09) [12]

var set_as_is:Set of Byte;
   set_as_bytes:array[0..31] of byte absolute set_as_is;


 
Palladin ©   (2006-10-03 15:15) [15]

и?


 
Сергей М. ©   (2006-10-03 15:15) [16]


> salexn   (03.10.06 15:04) [10]


Ты так и не сказал, с какими конкретно проблемами ты столкнулся, когда что-то там куда-то там "засовывал") ...


 
Palladin ©   (2006-10-03 15:16) [17]


> oxffff ©   (03.10.06 15:15) [14]

ShowMessage(IntToStr(SizeOf(Integer)))


 
salexn   (2006-10-03 15:19) [18]

а я и не говорил, что есть проблемы. Я описал алгоритм, который знаю, но предположил, что есть более красивый способ. Уважаемый Palldin и 0xxffff любезно предоставили альтернативный вариант


 
oxffff ©   (2006-10-03 15:21) [19]


> Palladin ©   (03.10.06 15:16) [17]
>
> > oxffff ©   (03.10.06 15:15) [14]
>
> ShowMessage(IntToStr(SizeOf(Integer)))


ShowMessage(IntToStr(SizeOf(Integer))). Равен 4 байта

ShowMessage(IntToStr(SizeOf(set of byte))). Равен 32 байта. А не бита.

Понятно? :)


 
Palladin ©   (2006-10-03 15:23) [20]

а... как всегда... перепутал... звиняюсь...


 
Сергей М. ©   (2006-10-03 15:23) [21]


> salexn   (03.10.06 15:19) [18]



> Palldin и 0xxffff любезно предоставили альтернативный вариант


угу .. который так и называется - "запихать")


 
saxon   (2006-10-03 15:23) [22]


> salexn   (03.10.06 15:19) [18]

А не проще ли хранть как целое, а потом - операции с битами, и далее к перечислениям и если хотите к "Set of ..."?


 
Palladin ©   (2006-10-03 15:26) [23]

оно не 1 целое... а целых 8... я тебя обманул...

var
set_as_is:Set of Byte;
set_as_ints:Array [0..7] of Integer absolute set_as_is;

s:="";
for i:=0 to 7 do s:=s+IntToStr(set_as_ints[i])+",";
SetLength(s,Length(s)-1);


 
salexn   (2006-10-03 15:26) [24]

>Сергей М.
Ок. Ваш вариант??


 
Сергей М. ©   (2006-10-03 15:27) [25]


> salexn   (03.10.06 15:26) [24]


Сначала определись с конкретной СУБД и конкретным типом поля, которое должно хранить сабж ..


 
oxffff ©   (2006-10-03 15:31) [26]

Сделай поле BLOB.


 
salexn   (2006-10-03 15:34) [27]

>oxffff
>Сделай поле BLOB
Чем мне поможет поле БЛОБ?


 
oxffff ©   (2006-10-03 15:38) [28]

Храни свои 32 байта в базе в RAW виде.
И загружай их также.


 
Игорь Шевченко ©   (2006-10-03 15:57) [29]

А нафига BLOB ?
Достаточно char(32) и хранить строки вида
"00000000000AE1200000000000000000",
"00000000000AE0100000000000000000"....


 
evvcom ©   (2006-10-04 08:42) [30]

> [29] Игорь Шевченко ©   (03.10.06 15:57)

Это шестнадцатиричный формат? Тогда char(64).


 
Игорь Шевченко ©   (2006-10-04 10:01) [31]

evvcom ©   (04.10.06 08:42) [30]

Точно :) Это вода кипит при ста градусах.


 
oxffff ©   (2006-10-04 10:38) [32]

Игорь Шевченко ©   (03.10.06 15:57) [29]
А нафига BLOB ?

А вы уверены, что с char(32) не будет проблем при преобразовании.

Возможно СУБД и средства доступа к данным могут обрезать часть до
char(0)?


 
Игорь Шевченко ©   (2006-10-04 11:27) [33]

oxffff ©   (04.10.06 10:38) [32]

Меня уже поправили, char(64) надо. Проблем при преобразовании не будет, так как в базе хранится строковое значение, а с ним вроде никаких проблем с обрезанием нету.



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

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

Наверх




Память: 0.54 MB
Время: 0.031 c
2-1159856930
Officeman
2006-10-03 10:28
2006.10.22
у кого Delphi-7, помогите. fsMDIForm сплошной глюк.


2-1159760787
mahab
2006-10-02 07:46
2006.10.22
Свойство Тор потомков TWinControl


2-1159978351
Дом
2006-10-04 20:12
2006.10.22
Реестр и бинарные данные


2-1160276062
m-kirill-2003
2006-10-08 06:54
2006.10.22
Кнопка на новую форму.


2-1159218974
or
2006-09-26 01:16
2006.10.22
Как через iStream передавать данные в dll и получать обратно?