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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
3-1120125911
Belkova
2005-06-30 14:05
2005.08.07
onKeyPress


1-1121319843
silvestr
2005-07-14 09:44
2005.08.07
Вывод надписи на поверх всех окон


14-1121761290
cyborg
2005-07-19 12:21
2005.08.07
Можно как нибудь найти или дать знать по Wi-Fi?


9-1113835930
_sHaDe_
2005-04-18 18:52
2005.08.07
Полёт пули(GLScene)


1-1121405141
Анастасия
2005-07-15 09:25
2005.08.07
Перетаскивание текста между формами