char (* text)[1][45+1];
text = calloc(5000,(130+1));
strcpy(0[*text],"sometext)");
Run Code Online (Sandbox Code Playgroud)
现在我想将"sometext"编码为base58,但是,我不知道如何,奇怪的是,在C中没有一个BASE58的例子.
我感兴趣的base58编码使用这些符号:
123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ
它已被优化以减少误读的风险,因此例如0和'O'都消失了.
PS不要介意变量的奇怪分配和声明,我正在试验.
小智 7
Satoshi有参考实现(https://github.com/bitcoin/bitcoin/blob/master/src/base58.h)
但是,他使用了一些实用程序bignum类来完成它,而且它是用C++编写的.如果您可以访问bignum库,则只需将58除以该数字即可.如果你没有一个bignum图书馆,AFAIK你运气不好.
小智 5
这是我为 Amithings 创建的大数的 PHP 实现,超出了整数(整数 -> http://php.net/manual/en/language.types.integer.php)。
例如,试试下面的例子(不要忘记将你的 ID 以字符串格式传递给函数。使用 PHP 函数 strval()):
$number = '123456789009876543211234567890';
$result = base58_encode($number);
echo('Encoded: ' . $result . '<br>');
echo('Decoded: ' . base58_decode($result) . '<br>');
Run Code Online (Sandbox Code Playgroud)
重要提示:您可以考虑通过包含某种密钥/密码/加密来更改此例程,以确保其他人无法解码您的数据库 ID。
function base58_encode($input)
{
$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
$base_count = strval(strlen($alphabet));
$encoded = '';
while (floatval($input) >= floatval($base_count))
{
$div = bcdiv($input, $base_count);
$mod = bcmod($input, $base_count);
$encoded = substr($alphabet, intval($mod), 1) . $encoded;
$input = $div;
}
if (floatval($input) > 0)
{
$encoded = substr($alphabet, intval($input), 1) . $encoded;
}
return($encoded);
}
function base58_decode($input)
{
$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
$base_count = strval(strlen($alphabet));
$decoded = strval(0);
$multi = strval(1);
while (strlen($input) > 0)
{
$digit = substr($input, strlen($input) - 1);
$decoded = bcadd($decoded, bcmul($multi, strval(strpos($alphabet, $digit))));
$multi = bcmul($multi, $base_count);
$input = substr($input, 0, strlen($input) - 1);
}
return($decoded);
}
Run Code Online (Sandbox Code Playgroud)