如何在php中将字节数组转换为整数?

8

我看到了一段代码,它可以将整数转换成字节数组。下面是如何将整数转换为字节数组的代码,适用于php3 (如何在php中将整数转换为字节数组):

<?php

$i = 123456;
$ar = unpack("C*", pack("L", $i));

print_r($ar);
?>

上面的代码将输出:
//output:
Array
(
   [1] => 64
   [2] => 226
   [3] => 1
   [4] => 0
)

但是我现在的问题是如何将这个过程反转。即从字节数组转换为整数。在上面的例子中,输出将是123456

有人可以帮助我吗?这将非常有帮助。谢谢。


尝试对此进行类型转换。 - Yogesh Suthar
可能是[Reverting unpack('C*', "string")]的重复问题。 - jk2K
这里是如何在PHP中将字节数组转换为浮点数。 - Syed Azhar Abbas
3个回答

11

为什么不把它当做数学问题来处理呢?

$i = ($ar[3]<<24) + ($ar[2]<<16) + ($ar[1]<<8) + $ar[0];

1
哇,这解决了我的问题,但我将代码更改为:$i = ($ar[4] << 24) + ($ar[3] << 16) + ($ar[2] << 8) + ($ar[1]);因为$ar [0]不存在,当加号之间没有括号时,它将返回0值。但还是谢谢。 - gchimuel
@gchimuel 最后一部分 $ar[0] 周围的括号是不必要的,其他部分是必要的。 - n0099

5

既然L长度为四个字节,你就知道数组的元素数量。因此,你可以简单地执行相反的操作:

$ar = [64,226,1,0];
$i = unpack("L",pack("C*",$ar[3],$ar[2],$ar[1],$ar[0]));

如果您可以确保$ar有4个项目并且从0到3进行索引,那么您也可以执行unpack('L', pack('C*', ...array_reverse($ar))) - n0099
还要注意,unpack('C*', $someBytesArray)的输出将从1开始索引,因此您应该在其上包装array_values() - n0099
array_reverse()的意思或者写字面量$ar[3], ..., $ar[0]的目的是为了在大端和小端之间转换字节顺序,如果你能确保在pack()unpack()过程中使用相同的字节顺序,那么就不需要反转它们。 - n0099

4
为了在PHP中获得一个已签名的4字节值,您需要执行以下操作:
    $temp = ($ar[0]<<24) + ($ar[1]<<16) + ($ar[2]<<8) + $ar[3];
    if($temp >= 2147483648)
         $temp -= 4294967296;

1
值得一提的是,这个解决方法适用于 PHP 的 x64 构建(除了 Windows 构建)。而且代码中有一个错误。比较应该是“大于或等于”,而不仅仅是“大于”。 - Denis V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接