如何将字节数组转换为Variant?
我有一个Web服务应该接收一个字节数组,但它只接受类型为VARIANT的变量,我想知道如何转换以便将其作为Web服务的参数传递。
谢谢
谢谢
SAFEARRAY
。在Delphi中可以这样做:V := VarArrayCreate([0, N-1], varByte);
或者,如果 SAFEARRAY
需要从 1 开始索引:
V := VarArrayCreate([1, N], varByte);
您可以使用循环填充数组,例如:V[i] := ...
。
如果您有一个Delphi动态array of Byte
,并且期望的SAFEARRAY
使用基于0的索引,则可以简单地编写:
V := a;
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]));
procedure SaveBytes(Data: Variant; var MS: TMemoryStream)
,您会这样做吗(抱歉代码在注释中!)? var SA: PVarArray; begin SA := VarArrayAsPSafeArray(Data); MS.Clear; MS.WriteBuffer(SafeArray.Data, VarArrayHighBound(Data, 1)); end;
- James L.MS.WriteBuffer(SA.Data^, SA.Bounds[0].ElementCount);
现在可以工作...完整示例在这里:https://dev59.com/S3nZa4cB1Zd3GeqPp3Dd#20141184 - James L.
VARIANT
可以包含许多不同格式的数据。仅仅知道数据包含在VARIANT
中并不足以说明问题。你需要它是哪种格式?除非你能回答这个问题,否则无法继续。 - David HeffernanV := VarArrayCreate([0, N-1], varByte)
,然后使用V[i] := ...
填充变量V
。但也许数组边界需要是[1,N]
。只有你自己知道。 - David Heffernan