将四个字节转换为32位无符号整数

时间:2018-06-08 14:20:27

标签: php

我在PHP脚本中有一个大的二进制缓冲区,找到一个特定的位置。我需要将4字节值转换为32位整数。

$seg = hex2bin("AABBCC00010014AABBCC");
$findStart=3;
echo bin2hex($seg[$findStart+0]);
echo bin2hex($seg[$findStart+1]);
echo bin2hex($seg[$findStart+2]);
echo bin2hex($seg[$findStart+3]);

Prints:
00010014

我需要将seg[findStart+0 .. findStart+3]转换为32位整数。如何在PHP脚本中执行此操作?此示例是十进制数字65556。

2 个答案:

答案 0 :(得分:2)

您可以使用ord()将单个字节转换为整数,然后使用左移和按位运算符。第一个字节将向左移24位,第二个字节将向左移16个字节,第三个字节为8个字节。

$a = ord($seg[$findStart+0]);
$b = ord($seg[$findStart+1]);
$c = ord($seg[$findStart+2]);
$d = ord($seg[$findStart+3]);

$newInt = ($a << 24) | ($b << 16) | ($c << 8) | $d;

答案 1 :(得分:2)

这正是the unpack function的目的,它采用格式字符串并从二进制字符串中提取数据。

查看格式代码列表和您的示例,我相信您想要

  

N:无符号长整数(总是32位,大端字节顺序)

所以它看起来像这样:

$int = unpack('Nvalue', $seg, $findStart)['value'];

为了与旧版本的PHP(&lt; 7.1)兼容,您可以通过在一个被忽略的变量中使用固定数量的字节来模拟偏移量参数:

$int = unpack("c{$findStart}ignore/Nvalue", $seg)['value'];