Why is the result of const char *
a string
and char *
an object „byte-array“?
A simple example:
$ffi = FFI::cdef(
"const char *strerror(int errnum);",
"libc.so.6"
);
var_dump($ffi->strerror(1));
returns
string(23) "Operation not permitted"
Removing const
from the definition returns:
object(FFICData:char*)#1074 (1) {
[0]=>
string(1) "O"
}
Background
A function of a dynamically linked external C library returns binary data which include NULL-bytes. When const
is in the definition of the header file the resulting string is not complete = shortened to the first NULL-byte = corrupt file.
My workaround
Remove const
from the definition and
$array = $ffi->strerror(1);
$string = FFI::string($array);
returns the correct complete string.
(In the real-life scenario the $size for FFI::string($array, $size)
is known and returned back from a different function of the C library.)
Advertisement
Answer
Dropping const
or adding unsigned
in the definition seem to be reasonable workarounds (cf. https://github.com/dstogov/php-ffi/issues/42#issuecomment-791237784)
Examples
Dropping const
$ffi = FFI::cdef(
"char *strerror(int errnum);",
"libc.so.6"
);
$array = $ffi->strerror(1);
$string = FFI::string($array);
var_dump($string);
Adding unsigned
(or changing to 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);