2011-11-18 56 views
0

我有一些壓縮的二進制數據和一個API調用來解壓縮它需要一個預先分配的目標緩衝區。沒有任何通過API的方式告訴我解壓縮數據的大小。所以我可以malloc超大緩衝區解壓縮到,但我想然後調整大小(或複製到)一個正確大小的內存緩衝區。那麼,我如何(確實可以)在超大緩衝區中確定解壓縮的二進制數據的實際大小?如何確定一個malloc'ed緩衝區的實際用法

(我不控制數據的壓縮,所以我不可能提前知道做什麼期望的大小,我不能寫頭的文件。)

+0

如果您提供的緩衝區太小,解壓縮API會失敗嗎?如果是這樣,也許它會告訴你應該提供多大的緩衝區?如果您希望我們幫助您,請提供更多信息。 – 2011-11-18 12:58:40

+0

我真的會切換庫,因爲你正在使用的顯然是不好的。 –

+0

解壓縮後甚至無法獲得未壓縮數據的大小,例如像來自uncomress函數的返回值?你在使用什麼API? –

回答

0

通常這個信息在壓縮時提供的(以例如看看7-Zip LZMA SDK)。

無法通過您現在提供的信息知道解壓縮數據的實際大小(或實際使用的部件的大小)。

0

如果解壓縮步驟沒有給你解壓縮的大小作爲返回值或某種方式的「out」參數,你不能。

無法確定有多少數據寫入緩衝區(調試器/ valgrind類型檢查之外)。

2

正如其他人所說,如果你的API沒有提供它,沒有好的方法來做到這一點。

我幾乎不想暗示該怕的是你要這個建議,有一些關鍵的部分應用程序的依賴於它,但是......

一個heurstic將填補你的緩衝區有一些「毒藥」模式,然後解壓縮成它。然後,在解壓縮後,掃描緩衝區以查找第一個出現的毒藥模式。

這是一種啓發式方法,因爲完全可以想象,解壓縮的數據可能碰巧發生了你的毒藥模式。除非你有確切的關於數據的領域知識,並且可以選擇一種你知道不可能存在的模式。

即使如此,充其量也是一個不完美的解決方案。

+2

而不是掃描第一次出現的緩衝區,從結尾向後掃描,直到您不再看到毒性模式。至少你只有在你的解壓縮數據碰到毒藥模式時纔會遇到問題,而不是在緩衝區內的任何地方發生。 – Vicky

+1

爲了使這更健壯,甚至可以使用兩種不同的毒藥模式進行兩次解壓縮,並驗證結束是否發生在相同的地方。這太可怕了,取決於你的限制,它不會給你提供比保留原有的太大緩衝區更好的性能,但至少它可能是一個脫離角落的方式。 – Vicky

+1

你肯定知道如果你解壓兩次,第一次用00填充緩衝區,第二次用FF填充緩衝區。但我當然不提倡這樣的黑客攻擊。 – indiv

0

解決此問題的一種複雜方法是​​將解壓縮兩次到超大緩衝區中。

在這兩種情況下,您都需要一個「隨機模式」。從結尾開始,您計算與該模式對應的字節數,並檢測解壓縮序列的結束位置。

還是呢?也許,偶然地,解壓縮序列的最後一個字節對應於這個確切位置上的隨機字節。所以最終解壓後的大小可能會大於檢測到的大小。如果你的模式是真正的隨機的,它不應該超過幾個字節。

您需要用隨機模式再次填充緩衝區,但是不同的模式。確保在每個位置新的隨機模式具有與舊的隨機模式不同的值。爲了獲得更快的速度,您沒有義務填充完整的緩衝區:您可能會將新模式限制爲之前的幾個字節,並在第一次檢測到結束之後再多一些字節。 32個字節就足夠了,因爲很多字節不可能偶然地對應於第一個產生的隨機模式。

解壓縮第二次。再次檢測模式不同的地方。取第一個和第二個結束檢測之間的兩個值中較大的一個。這是你解壓縮的大小。

-1

你應該檢查自由編譯器/操作系統 的工作原理,並執行相同的操作。 免費不佔用malloced數據的大小,但它以某種方式知道有多少空閒的權利;) 通常大小存儲在分配的緩衝區之前,不知道究竟如何maby字節再次依賴於os/arch/compiler

+0

這將作出一個很好的評論,但作爲一個答案... -1'd – vdbuilder