base58 是由中本聰為bitcoin設計的。
相比與base64的字元,他將一些直**來模糊的字元去除了。
字元共58個
在一些base58的實現**中,我們往往需要為生成的編碼後的字串預留空間,這是如何計算的呢?
例如一段原始碼及注釋:
std::vectorb58((pend - pbegin) * 138 / 100 + 1);
// log(256) / log(58), rounded up
這個公式看起來有點讓人摸不著頭腦,但經過一些思考,我想明白了。
在編碼後的字串中,每乙個字元都是從58個字元中當中選擇出來的。那麼這58種不同的資訊可以用多少bit來代替呢?顯然答案是log(2)58。換句話說,每乙個字母代表的資訊量是log(2)58 bit。
我們輸入的位元組流資訊量是固定的:(byte_length * 8)bit
那麼,需要預留的字元數量就是(byte_length * 8)/ log258
經過換算,
(byte_length * 8)/ log258 =
(byte_length * log2256) / log258 =
byte_length * 1.38
最後,還需要加向上取整
最終結果就是 byte_length * 1.37 + 1
base58編碼與解碼實現
base58編碼是位元幣位址生成演算法中的最後乙個步驟。演算法簡單,和上大學時候學過的十進位制轉十六進製制一樣,只不過現在變成了十進位制轉58進製,核心過程就是不斷的除58求餘。下面是go語言的實現過程 func base58encode data byte string bignum.divmod...
base64編碼是怎麼工作的
1 為什麼需要base64?ascii碼一共規定了128個字元的編碼,這128個符號,範圍在 0,127 之間.其中,0,31 及127,33個屬於不可列印的控制字元.在電子郵件傳輸資訊時,有些郵件閘道器會把 0,31 這些控制字元給悄悄清除.還有的早期程式,收到 128,255 之間的國際字元時,...
base64編碼是怎麼工作的
按 在布林教育php中級班的課堂上,有位同學問這樣乙個問題 我在用 base64 encode 對使用者名稱進行編碼時,會出來等號,是不是可以去掉?跟我來看完這篇文章,答案即揭曉.1 為什麼需要base64?ascii碼一共規定了128個字元的編碼,這128個符號,範圍在 0,127 之間.其中,0...