如何将字节数组转换为Variant

Jos*_*rdo 3 delphi variant

如何将字节数组转换为Variant?我有一个WebService应该接收一个byte数组,但它只接受VARIANT类型的变量,我想知道如何转换,以便将其作为Web Services的参数传递.

谢谢

Dav*_*nan 7

根据评论记录,您需要创建一个SAFEARRAY字节.这在Delphi中是这样做的:

V := VarArrayCreate([0, N-1], varByte);
Run Code Online (Sandbox Code Playgroud)

或者,如果SAFEARRAY需要基于1的索引:

V := VarArrayCreate([1, N], varByte);
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用循环填充数组V[i] := ....

如果你有一个Delphi动态array of Byte,并且预期SAFEARRAY使用基于0的索引,那么你可以简单地写:

V := a;
Run Code Online (Sandbox Code Playgroud)

如果要传输大量数据,那么元素调用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]));
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要使用基于1的索引:

V := VarArrayCreate([1,Length(a)], varByte);
SafeArray := VarArrayAsPSafeArray(V);
Move(Pointer(a)^, SafeArray.Data^, Length(a)*SizeOf(a[0]));
Run Code Online (Sandbox Code Playgroud)