如何将字节数组转换为Variant

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

1
变量可以以许多不同的形式存储数据。网络服务希望以哪种形式呈现它? - David Heffernan
Web服务接受类型为Variant的变量作为参数,但她必须具有一个字节数组的内容,不知道Web服务的操作,但告诉我应该以这种方式传递,意图是将文件发送给它。 - Jose Eduardo
1
我猜你不理解我的意思。VARIANT 可以包含许多不同格式的数据。仅仅知道数据包含在 VARIANT 中并不足以说明问题。你需要它是哪种格式?除非你能回答这个问题,否则无法继续。 - David Heffernan
你可能需要做的是调用 V := VarArrayCreate([0, N-1], varByte),然后使用 V[i] := ... 填充变量 V。但也许数组边界需要是 [1,N]。只有你自己知道。 - David Heffernan
我试图解释我的最终目标,我需要将一个文件传递给Web服务。但是Web服务的方法只接受Variant,因此我假设它是字节数组类型。将文件转换为字节很简单,但这次的问题是将这个数组传递给被接受Variant的Web服务。如果我没能够清楚地解释,那么请见谅。 - Jose Eduardo
显示剩余5条评论
1个回答

7
根据评论记录,您需要创建一个字节的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;

如果你要传输大量数据,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]));

一旦您将字节数组的VarArray传递给另一个进程,您如何访问数据以便将其写入某种内存流中?我一直在尝试,但还没有弄清楚... - James L.
你可以像这里的代码一样使用VarArrayAsPSafeArray来完成。 - David Heffernan
如果您将SAFEARRAY Variant传递给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.
我猜应该是这样的。假设变量作为安全数组接收。你的代码假定基于0的索引。PVarArray不包含边界吗? - David Heffernan
是的,结果发现它使用基于1的索引。现在一切都正常了。再次感谢!所以随着更改,MS.WriteBuffer(SA.Data^, SA.Bounds[0].ElementCount);现在可以工作...完整示例在这里:https://dev59.com/S3nZa4cB1Zd3GeqPp3Dd#20141184 - James L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接