【问题标题】:Packing C structs from PHP从 PHP 打包 C 结构体
【发布时间】:2013-05-14 06:45:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php c struct pack


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。在正常情况下,我会选择根本不做我正在做的事情,但不幸的是,这不是一个选择。我无法在我的目标系统上重新编译 PHP,所以(我认为)PHP 扩展是不可能的。我还必须保持与一些遗留 C 二进制文件的向后兼容性,并且切换消息传递系统将是……困难的。 :-)
    • 附带说明:您不需要重新编译 PHP 来编译扩展。只需创建一个基本扩展,运行phpize 并制作。甚至可以在 Windows 上工作...
    猜你喜欢
    • 2018-10-28
    • 2017-10-16
    • 2014-02-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多