Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
ВнизByte в OleVariant Найти похожие ветки
← →
_Anton (2005-07-21 14:23) [0]Как правильно преобразовать из массива Byte в OleVariant?
(необходимо записать данные в тег XML)
делал много и по-разному - string(H: byte) режет строку на нуле
← →
Digitman © (2005-07-21 14:31) [1]v: OleVariant;
ba: TByteArray;
..
v := VarArrayCreate([LoIndex, HiIndex], varByte);
for i:= LoIndex to HiIndex do
v[i] := ba[i];
сойдет ?
← →
REA (2005-07-21 14:35) [2]DynArrayToVariant еще
← →
_Anton (2005-07-21 15:25) [3]у меня буфер Byte:
Sign_Buf: PBYTE;
SignLen : DWORD;
SignLen :=512;
GetMem(Sign_Buf, SignLen);
и тег XML:
att: IXMLDOMAttribute;
att.value := ???
Есть ли что-то конкретное в Delphi для этого??
← →
Digitman © (2005-07-21 15:34) [4]сошлись на офиц.документ, утверждающий что олей-вариантная переменная, которая должна выступать в кач-ве правой части выражения присвоения св-ва att.value, обязана хранить данные такого-то типа
← →
_Anton (2005-07-21 15:46) [5]тут проблема в том, что надо записать буфер данных в XML тег
и всё;
просто при преобразовании att.value := string(Sign_Buf)
в тег иногда записывается не весь буфер - подозреваю, что проблема как раз в этом преобразовании (после какого-то символа
в двоичном виде - строка больше не считывается)
← →
Digitman © (2005-07-21 15:50) [6]
> в двоичном виде - строка больше не считывается
какого ж шута ты хранишь строковые данные в виде массива байт ?
кой-какие элементы которого, видимо, являются терминирующими символами при преобразовании вида string(Sign_Buf) ?
обычная AnsiString чем не удалась ? в кач-ве источника данных для последующего преобразования ?
← →
isasa © (2005-07-21 16:10) [7]Живой премер.
На стороне клиента
........................
function DynArrayToVar(var buf; dataLen: cardinal): variant;
var p : pointer;
begin
Result:=VarArrayCreate([0, dataLen], varByte);
p:=VarArrayLock(Result);
move(buf, p^, dataLen);
VarArrayUnlock(Result);
end;
.........................
Вызвваем метод интерф.
propInterf.Components:=DynArrayToVar(Data.Comp,
(high(Data.Comp)-low(Data.Comp)+1)*sizeof(rComponent));
......................
где
Data.Comp стр-ра типа
type
rComponent = record
id : integer;
Xi,
dXi : double;
end;
TrComponent = array of rComponent;
На стороне сервера (IDL)
...............
property Components: OleVariant write Set_Components;
..................
прием структуры
procedure TautoFLClass.Set_Components(value: OleVariant);
var pArr : ParComponent;
dataLen : Cardinal;
i : integer;
begin
dataLen:=VarArrayHighBound(Value, VarArrayDimCount(Value));
i:=dataLen div SizeOf(rComponent);
SetLength(Fks, i);
SetLength(FXi, i);
SetLength(FdXi, i);
pArr:=VarArrayLock(Value);
for i:=low(Fks) to high(Fks) do begin
Fks[i]:=pArr^[i].id;
FXi[i]:=pArr^[i].Xi*0.01;
FdXi[i]:=pArr^[i].dXi;
end;
VarArrayUnLock(Value);
end;
← →
isasa © (2005-07-21 16:14) [8]Пропустил
type
ParComponent = ^TrComponent;
← →
_Anton (2005-07-21 16:23) [9]!!!
есть же стандартное решение - и именно так всегда и делают
в таких случаях :
BinToHex(PCHAR(pSign_Buf),Sign_Buf_Array, dwSignLen);
и кода - две строчки :)
Всем спасибо.
← →
isasa © (2005-07-21 16:31) [10]Было но не пошло.
В конце концов, отработает идея упаковки массива байтов в массив вариант.
Накладные расходы большие, но работает ка часы
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c