【问题标题】:How to convert Array of bytes to Variant如何将字节数组转换为变体
【发布时间】:2012-10-30 16:20:15
【问题描述】:

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

谢谢

【问题讨论】:

  • 一个变体可以保存许多不同形式的数据。 Web 服务希望它采用什么形式。
  • Web Service接受参数作为Variant类型的变量,但她必须有一个字节数组的内容,不知道Web Service的操作但告诉我应该传递它这样,本意就是给它发送一个文件。
  • SAFEARRAY吗?请记住,VARIANT 只是一个容器。您仍然需要知道内容的预期格式。
  • 没有。我也可以告知分隔格式,我的困难是传递这个字节数组是唯一接受参数作为 Variant 的方法,如果你知道另一种方法可以帮助我,非常感谢。
  • 我猜你不理解我。 VARIANT 可以包含许多不同格式的数据。知道数据包含在VARIANT 中不足以说明问题。您需要它是哪种格式?除非你能回答这个问题,否则你无法继续。

标签: delphi variant


【解决方案1】:

根据评论线索,您需要创建一个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 方法也会导致逐个元素的复制,这对于大量数据来说会非常缓慢。

在你的位置上,我会一次性完成数组的 blit。像这样:

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 的字节数传递给另一个进程,如何访问数据以便将其写入某种内存流?我一直在尝试,但还没有弄清楚...
  • 你可以用 VarArrayAsPSafeArray 来做,就像这里的代码一样
  • 那么,如果您将 SAFEARRAY 变体传递给 procedure SaveBytes(Data: Variant; var MS: TMemoryStream),您会这样做吗(抱歉,注释中有代码!)? var SA: PVarArray; begin SA := VarArrayAsPSafeArray(Data); MS.Clear; MS.WriteBuffer(SafeArray.Data, VarArrayHighBound(Data, 1)); end;
  • 我猜它会这样。假设变量作为安全数组被接收。您的代码假定基于 0 的索引。 PVarArray 不包含边界吗?
  • 是的,来看看,它使用基于 1 的索引。现在一切正常。再次,谢谢!因此,随着更改,MS.WriteBuffer(SA.Data^, SA.Bounds[0].ElementCount); 现在可以工作了...在这里找到完整示例:stackoverflow.com/a/20141184/822072
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多