在涉及到不同的项目不同语言,经常碰到编码问题,典型的就是base58和base64的编码问题
Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。
相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。
设计Base58主要的目的是:
- 避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
- 不使用"+"和"/"的原因是非字母或数字的字符串作为帐号较难被接受。
- 没有标点符号,通常不会被从中间分行。
- 大部分的软件支持双击选择整个字符串。
但是这个base58的计算量比base64的计算量多了很多。因为58不是2的整数倍,需要不断用除法去计算。
而且长度也比base64稍微多了一点。
C#的实现跨越参考 https://github.com/adamcaudill/Base58Check
代码如下:需要添加System.Numerics;
/// <summary>
/// Base58Check Encoding / Decoding (Bitcoin-style)
/// </summary>
/// <remarks>
/// See here for more details: https://en.bitcoin.it/wiki/Base58Check_encoding
/// </remarks>
public static class Base58CheckEncoding
{
private const int CHECK_SUM_SIZE = 4;
private const string DIGITS = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
/// <summary>
/// Encodes data with a 4-byte checksum
/// </summary>
/// <param name="data">Data to be encoded</param>
/// <returns></returns>
public static string Encode(byte[] data)
{
return EncodePlain(_AddCheckSum(data));
}
/// <summary>
/// Encodes data in plain Base58, without any checksum.
/// </summary>
/// <param name="data">Th