【问题标题】:Byte arithmetic and manipulation of PHP stringPHP字符串的字节算术和操作
【发布时间】:2015-06-10 19:29:11
【问题描述】:

如果我使用$data = fread('myfile','rb') 将二进制文件读入变量,我如何一次处理$data 一个字节。我还想对每个字节执行操作,例如将其乘以一个数字并计算与另一个数字相关的模数。

我可以使用$data[$i] 将变量作为数组引用,但是我得到的字节是这个字符还是多字节字符?此外,当我这样做时,我无法对结果进行计算,例如$data[$i]*4,它始终为零。

我需要处理非常大的文件,因此需要快速解决。

谢谢

【问题讨论】:

标签: php byte


【解决方案1】:

我可以使用 $data[$i] 将变量作为数组引用,但是我得到的字节是这个字符还是多字节字符?

你会得到字节。 PHP 字符串是单字节的。

此外,当我这样做时,我无法对结果执行计算,例如 $data[$i]*4,它始终为零。

使用ord 将字符转换为数字,进行计算,如果需要,使用chr 转换回来。或者,使用unpack('c*', $buf) 转换整个缓冲区,这会为您提供一个数字数组。

【讨论】:

  • ord 和 unpack 有什么样的开销?我见过这些功能,但我认为它们会很慢,所以将它们忽略了。
  • 我做了一些非常粗略的基准测试,结果表明 ord 和 unpack 都不是很快(在我的开发机器上每兆大约需要一秒)。解包在内存方面非常昂贵,大约是解包数据内存的 200 倍。由于数据被读入了变量,在内存中以字节的形式存在,有没有低级的方法可以直接访问?
  • @Dom: ord 是一个非常简单的函数,而且速度很快。如果你想让你的循环更快,你可能需要一种编译语言,比如 C。
  • ord 只是降低我要处理的数据量的方法。由于字符串在 PHP 中必须具有二进制表示,因此我希望能够一次访问和操作该字节。诸如 mhash 之类的函数显然必须以二进制表示形式处理数据,并且每个字节似乎比 ord 快三个数量级。
猜你喜欢
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2012-07-16
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
相关资源
最近更新 更多