HI, 我使用压缩delphi库接收pAnsiChar作为参数。但我想在压缩文件中存储一个字数组。原型函数是:
MyArray: TWordDynArray;
function lzopas_compress(in_p: PAnsiChar; in_len: integer; out_p: PAnsiChar): integer;
我想将MyArray传递给函数。我该怎么做?
由于
答案 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;
但是,您必须查找算法,并找到输出缓冲区必须有多大的表达式。 (因为由于例如小输入缓冲区的压缩,数据通常会变得更大)。