3

バイト配列をバリアントに変換するには? バイトの配列を受け取る必要がある WebService がありますが、VARIANT 型の変数しか受け入れません。Web サービスのパラメーターとして渡すために変換する方法を知りたいです。

ありがとうございました

4

1 に答える 1

7

SAFEARRAYコメント トレイルによると、バイト数を作成する必要があります。これは、Delphi では次のように行われます。

V := VarArrayCreate([0, N-1], varByte);

または、 にSAFEARRAY1 ベースのインデックスが必要な場合:

V := VarArrayCreate([1, N], varByte);

その後、 を使用してループ内で配列を設定できますV[i] := ...

Delphi の dynamicarray of Byteがあり、予想されるSAFEARRAYが 0 ベースのインデックスを使用している場合は、次のように簡単に記述できます。

V := a;

転送するデータが大量にある場合、RTL が提供するデータの要素ごとの突っ込みはほとんど絶望的です。単純なv := aアプローチでさえ、大量のデータに対して恐ろしく遅くなる要素ごとのコピーになります。

あなたの立場では、私は配列を一度にブライトします。このような:

var
  i: Integer;
  a: array of Byte;
  V: Variant;
  SafeArray: PVarArray;
....
// populate a
V := VarArrayCreate([0,high(a)], varByte);
SafeArray := VarArrayAsPSafeArray(V);
Move(Pointer(a)^, SafeArray.Data^, Length(a)*SizeOf(a[0]));

または、1 から始まるインデックスを使用する必要がある場合:

V := VarArrayCreate([1,Length(a)], varByte);
SafeArray := VarArrayAsPSafeArray(V);
Move(Pointer(a)^, SafeArray.Data^, Length(a)*SizeOf(a[0]));
于 2012-10-30T17:05:54.833 に答える