[英]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.