PHP中64位整数的二进制值的base64编码无效
如何在PHP上对64位整数的二进制字符串使用base64编码 此代码未按预期工作PHP中64位整数的二进制值的base64编码无效,php,go,encoding,base64,Php,Go,Encoding,Base64,如何在PHP上对64位整数的二进制字符串使用base64编码 此代码未按预期工作 <?PHP $t=11545152599186258990; $byte_array_t = pack('P',$t); echo base64_encode($byte_array_t); //not correct result - it should be: LrwswB6fOKA= echo ' '; $t=11; $byte_array_t = pack('P',$t); echo base64_e
<?PHP
$t=11545152599186258990;
$byte_array_t = pack('P',$t);
echo base64_encode($byte_array_t); //not correct result - it should be: LrwswB6fOKA=
echo '
';
$t=11;
$byte_array_t = pack('P',$t);
echo base64_encode($byte_array_t); //correct
更新 尝试使用而不是
pack
。请确保将整数作为字符串传递给,否则它将溢出:
$t = gmp_init("11545152599186258990");
$byte_array_t = gmp_export($t, 8);
echo base64_encode($byte_array_t); // LrwswB6fOKA=
我为您建议一个棘手的解决方案,将您的号码分成两个32位并打包
$value = 11545152599186258990;
$highMap = 0xffffffff00000000;
$lowMap = 0x00000000ffffffff;
$higher = ($value & $highMap) >>32;
$lower = $value & $lowMap;
$packed = pack('NN', $higher, $lower);
list($higher, $lower) = array_values(unpack('N2', $packed));
$originalValue = $higher << 32 | $lower;
$value=11545152599186258990;
$highMap=0xFFFFFF00000000;
$lowMap=0x00000000ffffffff;
$higher=($value和$highMap)>>32;
$lower=$value&$lowMap;
$packed=pack('NN',$higher,$lower);
列表($higher,$lower)=数组_值(解包($N2',$packed));
$originalValue=$higher首先感谢JimB的正确评论和评论中关于您的问题
有没有办法在PHP中获取二进制值11545152599186258990
答案是:
PHP在内部将整数值存储为机器相关大小的有符号值(C类型long)。整数文本和生成整数类型边界之外的数字的操作将存储为浮点。将这些浮点数打包为整数时,首先将它们转换为整数类型。这可能会也可能不会产生所需的字节模式
64位机器上的输入范围为
9223372036854775807(最大有符号整数)
您可以将其与给定的数字进行比较
这里有一个非常重要的话题,最后也是这里
但仍在最大有符号整数的限制范围内。PHP没有无符号整数类型,因此11545152599186258990
溢出整数,并静默转换为浮点(1.1545152599186E+19)
。有没有办法在PHP中获取二进制值11545152599186258990?首先是如何获取数字的?您可以将其打包为2个32位的数字,但在代码中的其他位置,它仍可能被转换为浮点。我一点也不懂PHP,但可能有一些大的整数库或其他可以使用的东西。
$value = 11545152599186258990;
$highMap = 0xffffffff00000000;
$lowMap = 0x00000000ffffffff;
$higher = ($value & $highMap) >>32;
$lower = $value & $lowMap;
$packed = pack('NN', $higher, $lower);
list($higher, $lower) = array_values(unpack('N2', $packed));
$originalValue = $higher << 32 | $lower;