![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Byte в OleVariant
_Anton © (2005-07-21 14:23:00)Как правильно преобразовать из массива Byte в OleVariant?
(необходимо записать данные в тег XML)
делал много и по-разному - string(H: byte) режет строку на нуле
isasa (2005-07-21 16:31:00) [1]Было но не пошло.
В конце концов, отработает идея упаковки массива байтов в массив вариант.
Накладные расходы большие, но работает ка часы
_Anton (2005-07-21 16:23:00) [2]!!!
есть же стандартное решение - и именно так всегда и делают
в таких случаях :
BinToHex(PCHAR(pSign_Buf),Sign_Buf_Array, dwSignLen);
и кода - две строчки :)
Всем спасибо.
isasa (2005-07-21 16:14:00) [3]Пропустил
type
ParComponent = ^TrComponent;
isasa (2005-07-21 16:10:00) [4]Живой премер.
На стороне клиента
........................
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;
Digitman (2005-07-21 15:50:00) [5]
> в двоичном виде - строка больше не считывается
какого ж шута ты хранишь строковые данные в виде массива байт ?
кой-какие элементы которого, видимо, являются терминирующими символами при преобразовании вида string(Sign_Buf) ?
обычная AnsiString чем не удалась ? в кач-ве источника данных для последующего преобразования ?
_Anton (2005-07-21 15:46:00) [6]тут проблема в том, что надо записать буфер данных в XML тег
и всё;
просто при преобразовании att.value := string(Sign_Buf)
в тег иногда записывается не весь буфер - подозреваю, что проблема как раз в этом преобразовании (после какого-то символа
в двоичном виде - строка больше не считывается)
Digitman (2005-07-21 15:34:00) [7]сошлись на офиц.документ, утверждающий что олей-вариантная переменная, которая должна выступать в кач-ве правой части выражения присвоения св-ва att.value, обязана хранить данные такого-то типа
_Anton (2005-07-21 15:25:00) [8]у меня буфер Byte:
Sign_Buf: PBYTE;
SignLen : DWORD;
SignLen :=512;
GetMem(Sign_Buf, SignLen);
и тег XML:
att: IXMLDOMAttribute;
att.value := ???
Есть ли что-то конкретное в Delphi для этого??
REA (2005-07-21 14:35:00) [9]DynArrayToVariant еще
Digitman (2005-07-21 14:31:00) [10]v: OleVariant;
ba: TByteArray;
..
v := VarArrayCreate([LoIndex, HiIndex], varByte);
for i:= LoIndex to HiIndex do
v[i] := ba[i];
сойдет ?