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

时间:2017-09-14 12:35:04

标签: 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_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)



}

3 个答案:

答案 0 :(得分:2)

<强>更新

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

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

Demo

答案 1 :(得分:1)

我建议你使用一个棘手的解决方案,将你的数字分成两个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; 

答案 2 :(得分:0)

首先感谢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

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