2010-06-20 41 views
1

嗨, 我使用壓縮delphi庫,接收pAnsiChar作爲參數。但我想在壓縮文件中存儲一個字數組。原型功能是:德爾福 - 數組的字和PAnsichar

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

而且我想通過MyArray函數。我怎麼做?

謝謝

回答

2

完成此操作的顯而易見的方法是使用指針強制轉換。輸入「字符串」將是PAnsiChar(@MyArray[0]),並通過Length(MyArray) * sizeof(word)作爲長度參數。但這是顯而易見的解決方案錯誤的時代之一。它可能會工作,但由於TWordDynArray被定義爲array of word而不是packed array of word,元素打包問題可能會導致長度計算失敗,並且在Delphi版本中可能會有所不同。此外,這將提高一個邊界檢查錯誤,如果長度(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()。

+0

如果數組沒有被打包,很多將會中斷。鑑於avg代碼庫,爲這種情況做準備是沒有用的。 – 2010-06-21 07:05:25

0

嘗試使用TCompressionStream/TDecompressionStream。

+0

嗨 - 感謝您的意見。我認爲一個更好的答案會顯示它是如何使用的。 – iandotkelly 2014-01-18 14:09:16

0

我的建議是改變圖書館。你可以很容易地找到Delphi庫,這將允許你壓縮通用的TStream或緩衝區。在Delphi中使用PChars傳遞緩衝區作爲參數只會表明一個糟糕的設計和Delphi的一些知識(除非該函數有充分的理由在AnsiStrings上工作)。 AFAIK LZO是一種塊壓縮算法,實際上不需要使用PChar類型,它看起來可能是來自C/C++庫的盲端口,在沒有「字節」類型的情況下,許多庫可能會使用字符數組。這不是德爾福應該完成的方式。

+0

直到D2009沒有辦法overindex任何類型,但pchar。 – 2010-06-21 07:07:43

0

只需使用

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

但是必須查找算法,並找到輸出緩衝區必須爲多大的表達。 (由於對於例如小輸入緩衝器的壓縮常常數據可能變大)。