Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизКак засунуть 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.048 c