2016-11-18 28 views
0

我想分析一個Git打包文件的PHP中的zlib。 (有關格式herehere的詳細信息)。正如那些文章中提到的那樣,問題是packfile中沒有爲壓縮數據指定長度,這意味着您必須將其放入zlib中並使用zlib來確定數據的啓動和停止位置。儘管zlib的本地C API提供了在達到壓縮數據結束時返回的常量Z_STREAM_END,但PHP的zlib擴展沒有提供這樣的選項。 我的唯一的選擇似乎是一個字節一次添加到所述輸入數據流和檢查total_in(zlib的流struct的一部分)是否爲0,其中,根據所述PHP和zlib源代碼,復位到零每當inflate()返回Z_STREAM_END編輯:PHP重置值total_in值,而不是zlib。這在我的答案中鏈接的拉取請求中發生了變化。從內部結構得到的值代表情境資源

的問題是,如何獲取的total_in價值? PHP的inflate_init()函數返回解壓「上下文資源」,它從我的源代碼細讀表示struct zlib的使用。

在純PHP中,是否可以使用上下文資源從內部struct中獲取total_in的值?

謝謝。

編輯:基本上,我希望能夠在zlib.inflate環境中使用stream_context_get_options(),但我可以,因爲我得到Invalid stream/context parameter沒有。

回答

0

經過一番研究,這裏的結果(TL; DR:這是不可能沒有一個PHP補丁):

  • 首先,資源不只是結構。它們可以表示任何用Zend引擎註冊的C變量。一些屬性可能暴露給用戶空間(PHP代碼),例如stream_context_get_params()。但是,這與資源所代表的實際內容是分開的。
    • 值代表的資源不能直接提供給用戶空間。
    • 我已經添加了一些功能來公開我想要的信息。他們正在等待this php-src拉請求。