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);