0

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

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

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

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

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

4

1 回答 1

1

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

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

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

我推荐两种更可靠的方法之一,恕我直言:

  • 编写一个 PHP 扩展(这很容易),它会为您完成与结构相关的工作,包括 C 程序的头文件。如果您在目标系统(或具有相同环境的系统)上编译它,您将不会遇到上述问题
  • 选择另一种更高级别的通信机制:我们已经成功地将 SysV 消息用于非常相似的需求,但还有很多路要走。
于 2013-05-13T22:45:26.653 回答