【发布时间】:2021-11-07 03:25:45
【问题描述】:
关于上下文的几句话
我正在开发一个 PHP 库,它使用 PHP FFI 使 tensorflow 在 PHP 中可用。该库的一部分必须将字符串传递给 tensorflow 的 c 库。为了能够做到这一点,c头文件中有这些定义:
extern void TF_StringInit(TF_TString *t);
extern void TF_StringCopy(TF_TString *dst, unsigned const char *src,
size_t size);
经过大量调试,我得到了将字符串传递到 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);
问题
如果$str 是Hello World,我希望TF_TString 现在包含Hello World。
而是0Hello World。
所以字符串总是以0为前缀。
进一步的想法
理论上,这个问题有可能发生,因为我的逻辑将字符串从 tensorflow 转换回 php。但是,tensorflow 有一个名为StringJoin 的内部操作,它需要两个字符串作为输入,然后将它们连接起来。如果我对字符串Hello 和 World 使用该操作,我会得到4HelloR World。由于在连接词之间有一个新字符 R,我认为问题出在我的编码上,而不是其他地方。
我期待任何形式的意见
这是一个长期的问题,因为我不希望有很多人使用 PHP FFI,但也许(希望如此!)有人对 c 中的字符串有更多的了解可以提供帮助。
【问题讨论】:
-
请移除标签 C++