【问题标题】:Size of buffer to hold base58 encoded data保存 base58 编码数据的缓冲区大小
【发布时间】:2020-01-05 00:55:33
【问题描述】:

当试图了解 base58check 的工作原理时,在比特币的referenced implementation 中,当计算容纳 base58 编码字符串所需的大小时,它使用了以下公式:

// https://github.com/bitcoin/libbase58/blob/master/base58.c#L155
size = (binsz - zcount) * 138 / 100 + 1;

其中binsz 是要编码的输入缓冲区的大小,zcount 是缓冲区中前导零的数量。 138 和 100 来自什么?为什么?

【问题讨论】:

  • 这意味着每100个解码字符将变成138个编码字符或其他方式
  • 这背后的理论是什么?
  • 我不确定,我从未研究过比特币和选择 B58 编码背后的哲学。我的答案基于 B64,即* 4 / 3Wiki 表示to avoid both non-alphanumeric characters and letters which might look ambiguous when printed0, o, OI, l, 1

标签: bitcoin base58


【解决方案1】:

tl;博士 这是在base58 <-> base256 转换期间近似输出大小的公式。
即你乘以 256 和 58 的编码/解码部分

编码输出为输入大小的~138%(+1/向上取整):

n * log(256) / log(58) + 1  
(n * 138 / 100 + 1)

解码输出为输入大小的~73%(+1/向上取整):

n * log(58) / log(256) + 1  
( n * 733 /1000 + 1)

【讨论】:

  • 解码输出通常是输入大小的 73%。但您也可以有一个几乎全是前导零的输入,在这种情况下,解码后的输入大小约为输入大小的 100%(每个前导“1”字符解码为单个零字节)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2018-03-28
  • 1970-01-01
  • 2020-09-05
  • 2014-06-10
  • 2013-06-14
  • 2015-06-05
相关资源
最近更新 更多