从PHP打包C结构

时间:2013-05-13 22:33:56

标签: php c struct pack

我玩pack()的时间超过了我想承认的时间,偶然偶然发现了data structure alignment。是否有一种“好”的方法从PHP中创建C结构并考虑这些额外的填充字节?

我知道您可以使用“x”来注入NULL字节,但是如何确定这些字节的去向以及以编程方式使用多少?

同样,这些方法中哪一种更适合建模char foo[10]数组?

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

我相信他们都做了同样的事情,但我不确定是否有任何潜在的陷阱。

1 个答案:

答案 0 :(得分:1)

您尝试做的事情是可以实现的,但非常危险。让我解释一下:

  • PHP代码在很大程度上独立于
  • 上运行的硬件/ OS / C运行时
  • (便携式)C 代码大部分也是
  • C 二进制的编译/链接/加载过程绝对不是(特别是如果你将填充/打包问题留给编译器)

现在你在PHP中尝试做的是对这个编译/链接/加载过程的部分重新实现,但没有可靠的机制来确定适应环境。

我建议两种恕我直言中的一种更可靠的方法来做到这一点:

  • 编写一个PHP扩展(这很容易),它为您提供依赖于结构的东西,包括C程序的头文件。如果您在目标系统(或具有相同环境的系统)上编译它,您将不会遇到上述问题
  • 选择另一个更高级别的沟通机制:我们已经成功地使用了SysV消息来达到非常相似的要求,但还有很多方法可以去。