Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP打包C结构_Php_C_Struct_Pack - Fatal编程技术网

从PHP打包C结构

从PHP打包C结构,php,c,struct,pack,Php,C,Struct,Pack,我已经玩了很长时间,我不想承认,并意外地发现。有没有一种“好”的方法可以从PHP中创建C结构并考虑这些额外的填充字节 我知道可以使用“x”来注入空字节,但如何确定这些字节的位置以及以编程方式使用多少字节 同样,以下哪种方法更适合于对char-foo[10]数组进行建模 $struct = pack('a9x', $string); // vs. $struct = pack('a10', substr($string, 0, 9)); 我相信他们都完成了同样的任务,但我不确定是否存在任何潜在的

我已经玩了很长时间,我不想承认,并意外地发现。有没有一种“好”的方法可以从PHP中创建C结构并考虑这些额外的填充字节

我知道可以使用“x”来注入空字节,但如何确定这些字节的位置以及以编程方式使用多少字节

同样,以下哪种方法更适合于对
char-foo[10]
数组进行建模

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

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

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

  • PHP代码在很大程度上独立于它所运行的硬件/OS/C运行时
  • (可移植)C源代码也是
  • C二进制文件的编译/链接/加载过程肯定不是这样的(特别是如果将填充/打包问题留给编译器处理)
现在,您尝试在PHP中部分地重新实现这个编译/链接/加载过程,但是没有可靠的机制来决定是否适应环境

我推荐两种更可靠的方法之一:

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

谢谢您的回答。在正常情况下,我会选择根本不做我正在做的事情,但不幸的是,这不是一个选择。我无法在目标系统上重新编译PHP,因此(我认为)PHP扩展是不可能的。我还必须保持与一些遗留C二进制文件的向后兼容性,切换消息传递系统将是。。。难的。:-)附带说明:编译扩展不需要重新编译PHP。只需创建一个基本扩展,运行
phpize
并创建一个。甚至可以在windows上工作。。。