Php 操作二进制数据的有效方法

Php 操作二进制数据的有效方法,php,binary-data,Php,Binary Data,我有一个包含位图数据的字符串。基本上,它为图像中的每个像素保存1字节的红、绿、蓝循环 我想操纵位图中每个颜色通道的8位整数值。目前,我使用unpack('C'.strlen($string))来实现这一点,它为我提供了一个整数数组。这是非常缓慢的,因为它转换了大量数据 是否有更有效的方法以整数形式访问和修改字符串中的数据? 我所说的更有效率,是指比这更有效率: for($i = 0, $l = strlen($string); $i < $l; $i++) $string[$i]

我有一个包含位图数据的字符串。基本上,它为图像中的每个像素保存1字节的红、绿、蓝循环

我想操纵位图中每个颜色通道的8位整数值。目前,我使用
unpack('C'.strlen($string))
来实现这一点,它为我提供了一个整数数组。这是非常缓慢的,因为它转换了大量数据

是否有更有效的方法以整数形式访问和修改字符串中的数据?

我所说的更有效率,是指比这更有效率:

for($i = 0, $l = strlen($string); $i < $l; $i++)
    $string[$i] = chr(floor(ord($string[$i]) / 2));
for($i=0,$l=strlen($string);$i<$l;$i++)
$string[$i]=chr(floor(ord($string[$i])/2));
我除以2的操作只是一个例子。在一个真实的例子中,操作会更高级


上述示例的问题是,对于100万像素,您可以从PHP初始化300万个函数调用(
chr
floor
ord
)。在我的服务器上,对于一个示例图片,这相当于大约1.4秒。

PHP字符串本质上是字节数组。最快的方法就是:

for ($i = 0, $length = strlen($data); $i < $length; $i++) {
    $byte = $data[$i];

    ...
}
for($i=0,$length=strlen($data);$i<$length;$i++){
$byte=$data[$i];
...
}

如果您使用位运算符操作字节,很难获得比这更高的效率。您可以使用
$data[$i]=$newValue
将字节写回字符串。如果需要将单个字节转换为int,请使用
ord()
,另一种方法是使用
chr()

这不起作用:$byte=$data[$i]*0.5,我将做一个测试,看看对ord()的数百万次调用是否比unpack('C')快。strlen($data),$data)正如我所说的,
$byte
是一个原始字节。使用位运算符对其进行操作。如果您想使用整数算术,请使用
ord
将其转换为整数。因此,我应该尝试使用$data[$I]>>1?您知道用于执行更细粒度按位操作的源代码吗?例如如何使用位运算乘以0.9。使用位运算符进行除2的幂以外的任何数学运算都会很棘手。同样:
chr(ord($byte)*0.5)
,例如。
ord($byte)>>1
没有什么意义,
(int)”“
根据PHP的强制转换规则肯定不应该是32。你到底想干什么?你说你可以用C语言来做,所以我假设你知道你要做的二进制运算。当有人问起更有效的方法来做某事时,说这是一个基于观点的问题是荒谬的。效率很容易通过原始时间测量来衡量。