PHP FFI如何将void*转换为int?
解决PHP FFI中void*转int的问题
你遇到的FFI::cast("int", $voidptr)失效问题,核心原因是**int类型的宽度不一定和void*指针的宽度匹配**:在64位系统中,void*是64位,但标准int通常是32位,直接转换会导致截断或类型不兼容。
最优解决方法:使用指针兼容的整数类型转换
C标准定义了intptr_t和uintptr_t两种类型,它们的宽度与当前平台的指针宽度完全一致,专门用于存储指针值的整数表示。在PHP FFI中直接使用这两个类型进行转换即可:
$ffi = FFI::cdef( "void* get();", "dllpath"); $voidptr = $ffi->get(); // 正确转换void*为int,跨平台兼容 $intValue = FFI::cast("intptr_t", $voidptr); echo $intValue; // 输出555
如果你的场景中指针值是无符号的,也可以用uintptr_t替代intptr_t,效果一致。
为什么正则匹配的方法不推荐
通过print_r配合正则提取的方式完全依赖PHP输出格式的稳定性,不同PHP版本或环境下print_r对FFI指针对象的输出可能变化,容易引发兼容性问题,同时这种方式的效率也远低于直接的类型转换。
内容的提问来源于stack exchange,提问作者jennie
相关产品推荐
相关产品推荐

