如何解决php-ffi: 返回类型 const char* 是一个字符串
为什么 const char *
的结果是 string
和 char *
的对象“字节数组”?
一个简单的例子:
$ffi = FFI::cdef(
"const char *strerror(int errnum);","libc.so.6"
);
var_dump($ffi->strerror(1));
返回
string(23) "Operation not permitted"
从定义中删除 const
返回:
object(FFI\CData:char*)#1074 (1) {
[0]=>
string(1) "O"
}
背景
动态链接的外部 C 库的函数返回包含 NULL 字节的二进制数据。当 const
在头文件的定义中时,结果字符串不完整 = 缩短为第一个 NULL 字节 = 损坏的文件。
我的解决方法
从定义中删除 const
并
$array = $ffi->strerror(1);
$string = FFI::string($array);
返回正确的完整字符串。
(在实际场景中,FFI::string($array,$size)
的 $size 是已知的,并从 C 库的不同函数返回。)
解决方法
在定义中删除 const
或添加 unsigned
似乎是合理的解决方法(参见 https://github.com/dstogov/php-ffi/issues/42#issuecomment-791237784)
示例
删除 const
$ffi = FFI::cdef(
"char *strerror(int errnum);","libc.so.6"
);
$array = $ffi->strerror(1);
$string = FFI::string($array);
var_dump($string);
添加 unsigned
(或更改为 uint8_t
)
$ffi = FFI::cdef(
"const unsigned char *strerror(int errnum);","libc.so.6"
);
$byteArray = $ffi->strerror(1);
$charType = FFI::type('char*');
$castedValue = FFI::cast($charType,$byteArray);
$string = FFI::string($castedValue);
var_dump($string);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。