Delphi - Word和PAnsichar的数组

时间:2010-06-20 01:36:16

标签: delphi

HI, 我使用压缩delphi库接收pAnsiChar作为参数。但我想在压缩文件中存储一个字数组。原型函数是:

MyArray: TWordDynArray;
function lzopas_compress(in_p: PAnsiChar; in_len: integer; out_p: PAnsiChar): integer;

我想将MyArray传递给函数。我该怎么做?

由于

4 个答案:

答案 0 :(得分:2)

实现这一目标的显而易见的方法是使用指针转换。输入“string”为PAnsiChar(@MyArray[0]),并传递Length(MyArray) * sizeof(word)作为length参数。但这是明显解决方案错误的时候之一。它可能有效,但由于TWordDynArray被定义为array of word而不是packed array of word,因此元素打包问题可能会导致长度计算失败,并且它可能因Delphi版本而异。此外,如果Length(MyArray)= 0,则会引发边界检查错误。

更安全的方法是创建一个AnsiString,将其长度设置为Length(MyArray) * sizeof(word),然后使用这样的循环:

for i := 0 to high(MyArray) do
  Move(MyArray[i], MyString[(i * sizeof(word)) + 1], sizeof(word));

然后传递你的字符串,强制转换为PAnsiChar,以及字符串的Length()。

答案 1 :(得分:0)

尝试使用TCompressionStream / TDecompressionStream。

答案 2 :(得分:0)

我的建议是改变图书馆。您可以轻松找到允许您压缩通用TStream或缓冲区的Delphi库。使用PChars在Delphi中传递缓冲区作为参数只表示设计不好而且对Delphi知之甚少(除非该函数有充分理由使用AnsiStrings)。 AFAIK LZO是一种块压缩算法,实际上不需要处理PChar类型,它看起来它可能是来自C / C ++库的盲端口,如果没有“字节”类型,许多库可以使用字符数组。这不是在Delphi中应该完成的方式。

答案 3 :(得分:0)

只需使用

if length(myarr)>0 then
  begin
     outlen:=lzopas_compress(pansichar(@myarr[0]),length(myarr)*sizeof(word),out_p); 
  end
else
  outlen:=0;

但是,您必须查找算法,并找到输出缓冲区必须有多大的表达式。 (因为由于例如小输入缓冲区的压缩,数据通常会变得更大)。