【问题标题】:PHP fseek() equivalent for variables?PHP fseek() 等效于变量?
【发布时间】:2009-06-12 14:36:10
【问题描述】:

我需要的是 PHP 的 fseek() 函数的等价物。该函数适用于文件,但我有一个包含二进制数据的变量,我想处理它。我知道我可以使用substr(),但这会很糟糕——它用于字符串,而不是二进制数据。另外,创建一个文件然后使用fseek() 也不是我想要的。

也许是用流构建的东西?

编辑:好的,我快到了:

$data = fopen('data://application/binary;binary,'.$bin,'rb');

警告:打开流失败:rfc2397:非法参数

【问题讨论】:

  • 我不明白为什么不使用 substr()。您在使用中遇到过什么问题吗?

标签: php variables stream fseek


【解决方案1】:

凯:

您几乎已经在这里回答了自己。流就是答案。以下手动输入会有所启发:http://us.php.net/manual/en/wrappers.data.php

它本质上允许您将任意数据传递给 PHP 的文件处理函数,例如 fopen(以及 fseek)。

然后你可以这样做:

<?php

$data = fopen('data://mime/type;encoding,' . $binaryData);

fseek($data, 128);
?>

【讨论】:

  • 如果允许 url_fopen 在 php.ini 中打开,这将起作用
  • 代码无效。构造似乎是错误的。我确实设置了“rb”模式,但第一部分似乎在某种程度上是错误的。 “打开流失败:rfc2397:非法参数”
【解决方案2】:

fseek 对变量中的数据没有意义。 fseek 只是将文件句柄定位到指定的偏移量,因此下一个 fread 调用从该偏移量开始读取。没有等价于字符串的 fread。

substr() 有什么问题?

你会做一个文件:

$f = fopen(...)
fseek($f, offset)
$x = fread($f, len)

带子字符串:

$x = substr($var, offset, len)

【讨论】:

  • 那很慢。我正在处理大型二进制文件。这不是 substr() 的本意。
  • 我现在很困惑。是文件中的二进制数据还是 php 变量中的二进制数据。如果是文件为什么不使用 fseek?
  • 对不起。数据来自从传输中获取的文件(不是上传表单——我可以 fseek 临时文件,而不是文件系统——我不能使用 fseek 或为此创建文件没有意义)。
【解决方案3】:

我猜,但也许要求的是一种通过使用指针来访问变量中的字节的方法..(使用它就像你可以在 c 中做的字节数组一样 - 没有内存开销将数据放入 php 数组中)并能够就地编辑它们而无需复制数据的开销。

无法做到这一点是一个大问题,但如果操作系统可以很好地缓存磁盘数据,对临时文件使用 fseek 可能是一种解决方法。

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 2016-01-06
    • 1970-01-01
    • 2015-03-15
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多