2013-05-13 107 views
0

我玩過pack()的時間比我想承認的要長,並且偶然偶然發現了data structure alignment。有沒有一種「好」的方式來從PHP內部創建C結構並考慮這些額外的填充字節?從PHP包裝C結構

我知道你可以使用「x」來注入NULL字節,但你如何確定這些去哪裏以及以編程方式使用多少?

沿着同樣的路線,這些方法哪個更適合對char foo[10]陣列進行建模?

$struct = pack('a9x', $string); 
// vs. 
$struct = pack('a10', substr($string, 0, 9)); 

我相信他們都完成同樣的事情,但我不確定任何潛在的陷阱。

回答

1

你試圖做的是可以實現的,但是非常危險。讓我來解釋:

  • PHP代碼在很大程度上是獨立的,從它運行在
  • (便攜式)C 代碼的硬件/操作系統/ C運行時大多也是
  • 編譯/連接/加載過程一個C 二進制 definitly不是(尤其是如果你離開填充/包裝問題,編譯器)

現在嘗試在PHP做正是這種組合物1的部分重新實現的lation/linking/loading過程,但沒有可靠的機制來確定適應環境。

我推薦兩個恕我直言,更可靠的方法可以做到這一個:

  • 寫PHP擴展(這是相當容易的),但這結構相關的東西給你,包括你的C頭程序。如果你編譯這個目標系統(或具有同等環境)上,你會不會遇到麻煩以上
  • 選擇了另外一個更高層次的機制進行溝通:我們已經成功地使用SysV的消息非常類似的要求,但有有很多方法可以去。
+0

謝謝你的回答。在正常情況下,我會選擇不做我在做的事情,但不幸的是,這不是一種選擇。我無法在我的目標系統上重新編譯PHP,所以(我認爲)PHP擴展是不可能的。我也有保持向後兼容某些遺留的C二進制兼容性,並切換消息系統會...困難。只是在一個側面說明:-) – FtDRbwLXw6 2013-05-14 13:20:41

+0

:你不需要重新編譯PHP編譯的延伸。只需創建一個基本擴展名,運行'phpize'並製作。即使在窗戶上工作... – 2013-05-14 13:50:51