[英]How to convert bit torrent info hash from Base 32 into Base 16
I have a Base32 info hash. 我有一个Base32信息哈希。 eg
IXE2K3JMCPUZWTW3YQZZOIB5XD6KZIEQ
, and I need to convert it to base16. 例如
IXE2K3JMCPUZWTW3YQZZOIB5XD6KZIEQ
,我需要将其转换为base16。
How can I do it with PHP? 我该如何使用PHP?
My code looks like this: 我的代码如下所示:
$hash32=strtolower($hash32);
echo $hash32; // shows - IXE2K3JMCPUZWTW3YQZZOIB5XD6KZIEQ
$hash32=sha1($hash32);
$hash16=base_convert($hash32, 32, 16);
echo "</br>";
echo $hash16 // shows - 3ee5e7325a282c56fe2011125e0492f6ffbcd467
In my code the 16 based info hash is not valid.. 在我的代码中,基于16的信息哈希无效。
The valid Info hash is 45C9A56D2C13E99B4EDBC43397203DB8FCACA090
有效的信息哈希为
45C9A56D2C13E99B4EDBC43397203DB8FCACA090
How can I get a valid info hash? 如何获得有效的信息哈希?
Thanks 谢谢
I give you an answer with voluntarily omitting gmp_strval(gmp_init(strtoupper($hash32), 32), 16);
我通过自愿省略
gmp_strval(gmp_init(strtoupper($hash32), 32), 16);
给您一个答案 which only works with GMP installed in your server. 仅适用于服务器中安装的GMP 。
function convBase($numberInput, $fromBaseInput, $toBaseInput)
{
if ($fromBaseInput==$toBaseInput) return $numberInput;
$fromBase = str_split($fromBaseInput,1);
$toBase = str_split($toBaseInput,1);
$number = str_split($numberInput,1);
$fromLen=strlen($fromBaseInput);
$toLen=strlen($toBaseInput);
$numberLen=strlen($numberInput);
$retval='';
if ($toBaseInput == '0123456789')
{
$retval=0;
for ($i = 1;$i <= $numberLen; $i++)
$retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i)));
return $retval;
}
if ($fromBaseInput != '0123456789')
$base10=convBase($numberInput, $fromBaseInput, '0123456789');
else
$base10 = $numberInput;
if ($base10<strlen($toBaseInput))
return $toBase[$base10];
while($base10 != '0')
{
$retval = $toBase[bcmod($base10,$toLen)].$retval;
$base10 = bcdiv($base10,$toLen,0);
}
return $retval;
}
This function, found here , "converts an arbitrarily large number from any base to any base" . 此功能,发现在这里 ,“从任何基础,任何基地转换任意大量的”。 You only need to convert from base 32 to base 16 , hence:
您只需要从32转换为16即可 ,因此:
base 32 alphabet is: ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
基本的32个字母为:
ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
$hash32='IXE2K3JMCPUZWTW3YQZZOIB5XD6KZIEQ';
$hash16=convBase($hash32, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', '0123456789ABCDEF');
//$hash16='45C9A56D2C13E99B4EDBC43397203DB8FCACA090'
The problem here was that base_convert
mishandle large numbers. 这里的问题是
base_convert
错误地处理了大数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.