嗨, 我使用壓縮delphi庫,接收pAnsiChar作爲參數。但我想在壓縮文件中存儲一個字數組。原型功能是:德爾福 - 數組的字和PAnsichar
MyArray: TWordDynArray;
function lzopas_compress(in_p: PAnsiChar; in_len: integer; out_p: PAnsiChar): integer;
而且我想通過MyArray函數。我怎麼做?
謝謝
嗨, 我使用壓縮delphi庫,接收pAnsiChar作爲參數。但我想在壓縮文件中存儲一個字數組。原型功能是:德爾福 - 數組的字和PAnsichar
MyArray: TWordDynArray;
function lzopas_compress(in_p: PAnsiChar; in_len: integer; out_p: PAnsiChar): integer;
而且我想通過MyArray函數。我怎麼做?
謝謝
完成此操作的顯而易見的方法是使用指針強制轉換。輸入「字符串」將是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()。
嘗試使用TCompressionStream/TDecompressionStream。
嗨 - 感謝您的意見。我認爲一個更好的答案會顯示它是如何使用的。 – iandotkelly 2014-01-18 14:09:16
我的建議是改變圖書館。你可以很容易地找到Delphi庫,這將允許你壓縮通用的TStream或緩衝區。在Delphi中使用PChars傳遞緩衝區作爲參數只會表明一個糟糕的設計和Delphi的一些知識(除非該函數有充分的理由在AnsiStrings上工作)。 AFAIK LZO是一種塊壓縮算法,實際上不需要使用PChar類型,它看起來可能是來自C/C++庫的盲端口,在沒有「字節」類型的情況下,許多庫可能會使用字符數組。這不是德爾福應該完成的方式。
直到D2009沒有辦法overindex任何類型,但pchar。 – 2010-06-21 07:07:43
只需使用
if length(myarr)>0 then
begin
outlen:=lzopas_compress(pansichar(@myarr[0]),length(myarr)*sizeof(word),out_p);
end
else
outlen:=0;
但是必須查找算法,並找到輸出緩衝區必須爲多大的表達。 (由於對於例如小輸入緩衝器的壓縮常常數據可能變大)。
如果數組沒有被打包,很多將會中斷。鑑於avg代碼庫,爲這種情況做準備是沒有用的。 – 2010-06-21 07:05:25