Estoy trabajando en una biblioteca PHP que usa PHP FFI para hacer que tensorflow se pueda usar en PHP. Una parte de esa biblioteca tiene que pasar cadenas a la biblioteca c de tensorflow. Para poder hacer eso, existen estas definiciones en el archivo de encabezado c:
extern void TF_StringInit(TF_TString *t); extern void TF_StringCopy(TF_TString *dst, unsigned const char *src, size_t size);Después de mucha depuración, llegué a este código que pasa la cadena a TF_TString:
// Initialize the TF_TString $tstr = TensorFlow::$ffi->new('TF_TString[1]'); TensorFlow::$ffi->TF_StringInit(FFI::addr($tstr[0])); // Unpack the input string $unpacked = unpack('C*', $str); $input = FFI::new('uint8_t[' . count($unpacked) . ']'); foreach($unpacked as $i=>$part) { $input[$i - 1] = $part; } // Copy the unpacked string into the TF_TString TensorFlow::$ffi->TF_StringCopy(FFI::addr($tstr[0]), $input, strlen($str) + 1); Si $str es Hello World , esperaría que TF_TString ahora contenga Hello World .
En su lugar, es 0Hello World .
Entonces, la cadena siempre tiene el prefijo 0 .
En teoría, sería posible que este problema suceda debido a mi lógica que convierte la cadena de tensorflow nuevamente a php. Sin embargo, tensorflow tiene una operación interna llamada StringJoin que espera dos cadenas como entrada y las une. Si uso esa operación para las cadenas Hello y World , obtengo 4HelloR World . Como hay un nuevo carácter R entre las palabras unidas, espero que el problema resida en mi codificación y no en otro lugar.
Esta es una pregunta poco probable, porque no espero que mucha gente trabaje con PHP FFI todavía, pero tal vez (¡con suerte!) Hay alguien con más conocimiento sobre cadenas en c que pueda ayudar.
Tu intento es demasiado complejo. No necesita usar ninguna matriz, no necesita "descomprimir" la cadena PHP. El primer ejemplo de esta página muestra que puede pasar directamente una cadena PHP a un const char * param.
Aquí hay un ejemplo simple que debería funcionar:
$ffi = FFI::cdef(' typedef struct TF_TString { char raw[24]; } TF_TString; void TF_StringInit(TF_TString *t); void TF_StringCopy(TF_TString *dst, const char *src, size_t size); ', 'tensorflow.dll'); // Allocate a TF_TString struct $tstr = $ffi->new('TF_TString'); // Initialize it $ffi->TF_StringInit(FFI::addr($tstr)); // Copy a PHP string to it $s = 'Hello World'; $ffi->TF_StringCopy(FFI::addr($tstr), $s, strlen($s));