1. 程式人生 > >Base58編碼解碼Go實現

Base58編碼解碼Go實現

base58和base64一樣是一種二進位制轉可視字串的演算法,主要用來轉換大整數值。區別是,轉換出來的字串,去除了幾個看起來會產生歧義的字元,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的字母L) ,和幾個影響雙擊選擇的字元,如/, +。

結果字符集正好58個字元(包括9個數字,24個大寫字母,25個小寫字母)。

編碼流程 (本質為大數與字串的轉化)

  1. 輸入為bytes,比如:[0x00, 0xFF]

  2. 忽略前面的0x00得到數字256

  3. 256通過base58編碼為字串”5Q”,因為要處理0x00,所以得到字串”15Q”

  4. 把字串“15Q”轉化為bytes: [0x49, 0x53, 0x81]

實現

package main

import (
    "bytes"
    "math/big"
)

var b58Alphabet = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")

func Base58Encode(input []byte) []byte {
    var result []byte

    x := big.NewInt(0).SetBytes(input)

    base := big.NewInt(int64(len(b58Alphabet)))
    zero := big.NewInt(0
) mod := &big.Int{} for x.Cmp(zero) != 0 { x.DivMod(x, base, mod) result = append(result, b58Alphabet[mod.Int64()]) } ReverseBytes(result) for _, b := range input { if b == 0x00 { result = append([]byte{b58Alphabet[0]}, result...) } else
{ break } } return result } func Base58Decode(input []byte) []byte { result := big.NewInt(0) zeroBytes := 0 for _, b := range input { if b != b58Alphabet[0] { break } zeroBytes++ } payload := input[zeroBytes:] for _, b := range payload { charIndex := bytes.IndexByte(b58Alphabet, b) result.Mul(result, big.NewInt(int64(len(b58Alphabet)))) result.Add(result, big.NewInt(int64(charIndex))) } decoded := result.Bytes() decoded = append(bytes.Repeat([]byte{byte(0x00)}, zeroBytes), decoded...) return decoded }

更多

相關推薦

Base58編碼解碼Go實現

base58和base64一樣是一種二進位制轉可視字串的演算法,主要用來轉換大整數值。區別是,轉換出來的字串,去除了幾個看起來會產生歧義的字元,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的字母L) ,和幾個影響雙擊選擇的字元

哈夫曼編碼解碼 C++實現

錯誤 urn using 過程 簡單 cin n) struct ren 哈夫曼編碼是一個通過哈夫曼樹進行的一種編碼,一般情況下,以字符:‘0’與‘1’表示。編碼的實現過程很簡單,只要實現哈夫曼樹,通過遍歷哈夫曼樹,這裏我們從每一個葉子結點開始向上遍歷,如果該結點為父節點的

base58編碼原理和實現(golang)

在看EOS原始碼時,接觸到base58編碼。和通常base64編碼一樣,base58編碼的作用也是將非可視字元視覺化(ASCII化)。但不同的是base58編碼去掉了幾個看起來會產生歧義的字元,如 0 (零), O (大寫字母O), I (大寫的字母i) and l (小寫的

JS實現—Base64編碼解碼,帶16進制顯示

ech encode break 復制代碼 bre zab idt pts image 代碼如下: <!DOCTYPE html> <html> <head> <meta name="viewport" conte

CImg:外掛(plugin)使用說明塈實現JPEG影象記憶體編碼/解碼

殺雞用牛刀? 如果你想對影象進行簡單處理,你一般會想到用什麼?可能多數人想到的是OpenCV。 對,OpenCV是個非常強大的影象視覺工具庫,用途非常廣泛。簡單的影象處理用它肯定是可以的。 但OpenCV實在太龐大了,用起來有時反而不方便,就好比你現在肚子餓了只

Java理解實現哈夫曼樹以其編碼解碼

哈夫曼樹以其編碼解碼 要求: 1.從終端讀入字符集大小為n(即字元的個數),逐一輸入n個字元和相應的n個權值(即字元出現的頻度),建立哈夫曼樹,進行編碼並且輸出。 將它存於檔案hfmtree中(選做)。 2.利用已建好的哈夫曼編碼檔案hfmtree,對鍵盤輸入的正文進行譯碼。輸出字元正文

go實現橢圓曲線加解密、簽名驗證演算法(go ecdsa庫的運用),及生成比特幣地址過程講解、base58實現

go實現橢圓曲線加解密、簽名驗證演算法(go ecdsa庫的運用),及生成比特幣地址過程講解、BASE58實現 前言 本文主要講解使用Go的ecdsa庫實現橢圓曲線加解密、簽名、驗證演算法,同時通過公鑰生成比特幣地址,具體程式碼邏輯參考bitcoin0

go實現一個簡單的遊戲伺服器框架(lotou)編碼

程式碼倉庫 在lotou中實現了兩種二進位制編碼方式。 binary 一種是普通的C/C++模式的小端編碼方式,每一個數據都被依次編碼進一個二進位制流中,基本用法如下: 編碼 binary.Encode(v) binary.Encode(v)

Libb64:c/c++實現的base64編碼解碼庫函式

base64編碼解碼本身也不復雜,但要自己寫,還是得花點時間,如果能找到現成的可靠的程式碼,抄來最好,節省了測試的時間。 libb64就是實現base64編碼解碼的開源庫,還提供了C++封裝,用起來也挺方便 下面是使用libb64 C++封裝介面進行ba

C++利用boost實現base64編碼解碼

#include <boost/archive/iterators/base64_from_binary.hpp> #include <boost/archive/iterators/binary_from_base64.hpp> #include &

PHP實現UCS2編碼解碼

//手機發送簡訊時編碼 /***  * @Method Ucs2Code UCS2編碼  * @Param $str 輸入字串  * @Param $encod 輸入字串編碼型別(UTF-8,GB2312,GBK)  * @Return 返回編碼後的字串 */ functio

Base64編碼解碼C語言實現

static const char *codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const unsigned char map[256] = {

Openssl實現生成比特幣地址的base58編碼

比特幣協議中比特幣地址的生成演算法如下: 比特幣地址(Bitcoin Address)是ECDSA公鑰(public key)的雜湊,它是這樣計算出來的: Version = 1 個位元組 0

PHP實現Huffman編碼/解碼

Huffman 編碼是一種資料壓縮演算法。我們常用的 zip 壓縮,其核心就是 Huffman 編碼,還有在 HTTP/2 中,Huffman 編碼被用於 HTTP 頭部的壓縮。 本文就來用 PHP 來實踐一下 Huffman 編碼和解碼。 1. 編碼

Go語言編碼角度解釋實現簡易區塊鏈——實現交易

在公鏈基礎上實現區塊鏈交易 區塊鏈的目的,是能夠安全可靠的儲存交易,比如我們常見的比特幣的交易,這裡我們會以比特幣為例實現區塊鏈上的通用交易。上一節用簡單的資料結構完成了區塊鏈的公鏈,本節在此基礎上對區塊鏈的交易部分進行實現。實現公鏈 交易機制 在區塊鏈中,交易一旦被建立,就沒有任何人能夠再去修改或是刪除它,

C#對字符串進行編碼解碼

odin div 字符串 編碼解碼 odi encode cnblogs 進行 viewbag 以UTF8編碼格式為例: 1 //編碼 2 ViewBag.FileURL = HttpUtility.UrlEncode(UriString, Encoding.UTF8);

ffmpeg實時編碼解碼部分代碼

分代 pac rgb ng- cte qpi truct tcp conn 程序分為編碼端和解碼端,兩端通過tcp socket通信,編碼端一邊編碼一邊將編碼後的數據發送給解碼端。解碼端一邊接收數據一邊將解碼得到的幀顯示出來。 代碼中的編碼端編碼的是實時屏幕截圖

JS對URL字符串進行編碼/解碼分析

rdquo 說明 cbe 字符值 name ide 就會 aca img 雖然escape()、encodeURI()、encodeURIComponent()三種方法都能對一些影響URL完整性的特殊 字符進行過濾。但後兩者是將字符串轉換為UTF-8的方式來傳輸,解決了頁面

常見編碼解碼腳本

table 我們 edi except 函數 運行 div clas href 在平時我們會遇到各種各樣的編碼,在這裏,我總結了一些常見的編碼,並不是很全 嘗試著做了個編碼解碼的匯總,並且寫了個腳本出來,由於python功底不是很強,所以可能會有不到之處,還望各位多多指正

直接插入排序(go實現)

排序 插入排序 直接插入排序 golang gopackage main import "fmt" func main() { arr := []int{11, 2, 7, 11, 88, 91, 23, 14, 12, 33} straightInsertSort(arr) fo