PHP关于64位整型的二进制实现

项目中用到一个C的二进制接口,需要通过php拼包请求接口同时解析返回的二进制包。
比较特殊的一点是,接口里有用到64位整型,但是php的pack/unpack原生并不支持64位整型,为了解决这个着实费了一番功夫。

实现原理

将一个64位整型转换成高位和低位的两个32位整型,通过两个32位整型的结构来表示一个64位整型。

实现代码

<?php
define("BIGINT_DIVIDER", 0x7fffffff + 1);

function split2Int(&$upper, &$lower, $value) {
    $lower = intval($value % BIGINT_DIVIDER);
    $upper = intval(($value - $lower) / BIGINT_DIVIDER);
}

function bigInt2float($upper, $lower) {
    return $upper * BIGINT_DIVIDER + $lower;
}

$num = 5000000000;
split2Int($upper, $lower, $num);

$buffer = pack('NN', $upper, $lower); // 大端序
$result = unpack('Nupper/Nlower', $buffer);

echo bigInt2float($upper, $lower); // 5000000000

参考资料:
PHP: pack/unpack补遗
PHP pack() format for signed 32 int - big endian
A 64 bit integer for PHP

标签: none

添加新评论