代码之家  ›  专栏  ›  技术社区  ›  Whome

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

php
  •  2
  • Whome  · 技术社区  · 7 年前

    我在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 回复  |  直到 7 年前
        1
  •  2
  •   IMSoP    7 年前

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

    看看格式代码列表,还有你的例子,我相信你想要

    N:无符号长(始终为32位,字节顺序为大端)

    所以看起来像这样:

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

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

    $int = unpack("c{$findStart}ignore/Nvalue", $seg)['value'];
    
        2
  •  2
  •   IMSoP    7 年前

    你可以使用 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;
    
    推荐文章