Base58编码简析与C++实现
参照:
https://en.wikipedia.org/wiki/Base58
https://en.wikipedia.org/wiki/Binary-to-text_encoding
https://en.bitcoin.it/wiki/Base58Check_encoding
Base58可以简单理解为将数据,以58进制的形式进行表示。
实现伪代码如下:
code_string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
x = convert_bytes_to_big_integer(hash_result)
output_string = ""
while(x > 0)
{
(x, remainder) = divide(x, 58)
output_string.append(code_string[remainder])
}
repeat(number_of_leading_zero_bytes_in_hash)
{
output_string.append(code_string[0]);
}
output_string.reverse();
大值思路为:
1. 将数据转换为大整数x,
2. 依次将(x % 58)的值表示的编码添加到输出字符串末尾;
3. 令x = ( x / 58 );
4. 重复2-3,直到x等于0;
5. 将数据前所有0的编码(即“1”)添加到输出字符串末尾;
6. 将输出字符串反转,即为Base58编码字符串。
由于编码前数据可以视为256进制编码数据,所以转换为58进制编码数据后,数据长度为变长。
假设原长度为Len256,转换为长度为Len58,则:
Len58 = Len256 * ( log256 / log58 ) + 1
Bitcoin(0.16.0)中实现代码如下:
/** All alphanumeric characters except for "0", "I", "O", and "l" */
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVW