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