繁体   English   中英

PHP中64位整数的二进制值的base64编码不起作用

[英]base64 encoding of binary value of 64 bit integer in PHP is not working

如何在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_encode($byte_array_t); //correct

我这样做是因为我试图在PHP中实现以下代码(golang):

package main
import (
"fmt"
"encoding/base64"
"encoding/binary"
)



func main()  {

    dst := make([]byte, 8)
    binary.LittleEndian.PutUint64(dst, uint64(11545152599186258990))
    value :=base64.URLEncoding.EncodeToString(dst)
    fmt.Println(value)



}

更新

尝试使用gmp_export而不是pack 确保将整数作为字符串传递给gmp_init ,否则会溢出:

$t = gmp_init("11545152599186258990");
$byte_array_t = gmp_export($t, 8);
echo base64_encode($byte_array_t); // LrwswB6fOKA=

演示

我建议你使用一个棘手的解决方案,将你的数字分成两个32Bit并打包它们。

$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; 

首先感谢JimB的正确评论和评论中的问题,

有没有办法在PHP中获取11545152599186258990的二进制值?

答案是 :

PHP在内部将整数值存储为与机器相关的大小(C类型长)的有符号值。 产生超出整数类型边界的数字的整数文字和操作将存储为float。 将这些浮点数打包为整数时,首先将它们转换为整数类型。 这可能会也可能不会产生所需的字节模式。 http://php.net/manual/ro/function.pack.php

64位机器上的输入范围是

9223372036854775807(最大有符号整数) http://php.net/manual/en/function.decbin.php

你可以将它与给定的数字进行比较。

这里有一个非常重要的主题https://wiki.php.net/rfc/pack_unpack_64bit_formats ,最后在这里https://github.com/php/php-src/commit/63fd969300e39302b1f8c600bc24f049a0e13370

但仍在最大有符号整数的限制范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM