【问题标题】:php-ffi: Return type const char* is a stringphp-ffi:返回类型 const char* 是一个字符串
【发布时间】:2021-05-30 22:42:27
【问题描述】:

为什么const char *stringchar * 的结果是对象“字节数组”?

一个简单的例子:

$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 库的不同函数返回。)

【问题讨论】:

    标签: php c char constants php-ffi


    【解决方案1】:

    在定义中删除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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多