如何在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)
}
答案 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=
答案 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
但仍在最大有符号整数的限制范围内。