本教材由知了传课辛苦制作而成,仅供学习使用,请勿用于商业用途!如进行转载请务必注明出处!谢谢!

解码编码

一、常见的编码

  1. base64:26个小写字母、26个大写字母、10个数字、/、+

  2. base58(区块链):去掉6个容易混淆的,去掉0,大写的O、大写的I、小写的L、/、+

  • /、+影响双击选择

二、go实现base64编码、解码

  • 编码

使用:encoding/base64

input := []byte("hello world") encodeString := base64.StdEncoding.EncodeToString(input) 在url中使用: uEnc := base64.URLEncoding.EncodeToString([]byte(input))
  • 解码
decodeBytes, err := base64.StdEncoding.DecodeString(encodeString) 在url中使用: uDec, err := base64.URLEncoding.DecodeString(uEnc)

三、go实现base58编码解码、解码

base58编码表

字符1代表0,字符2代表1,…,字符z代表57

  • 编码

  • 流程:

  • 将字符串的每个字节换算成ASCII,字符串实际上就是256进制的数字组合

  • 将256进制的数字转换成10进制数字

  • 将10进制数字转换成58进制数字(除以58,每次得到的余数就是对应的58进制,0用编码1来代表)

  • 将58进制数字对照58编码表找到对应的字符

  • 256进制转十进制:

  • h:104

  • a:97

  • 104*256+97=26721

package utils import ( "fmt" "math/big" "bytes" ) var b58 = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") // base58编码 func Base58Encoding(src string) (string) { // he : 104 101 --> 104*256 + 101 = 26725 // 26725 / 58 = 15 16 17 // 1.ascii码对应的值 src_byte := []byte(src) // 转成十进制 i := big.NewInt(0).SetBytes(src_byte) var mod_slice []byte // 循环取余 //for i.Cmp(big.NewInt(0)) != 0 { for i.Cmp(big.NewInt(0)) > 0 { mod := big.NewInt(0) i58 := big.NewInt(58) // 取余 i.DivMod(i,i58,mod) // 将余数添加到数组中 mod_slice = append(mod_slice, b58[mod.Int64()]) } // 把0使用字节'1'代替 for _,s := range src_byte { if s != 0 { break } mod_slice = append(mod_slice, byte('1')) } // 反转byte数组 //ret_mod_slice := ReverseByteArr(mod_slice) ret_mod_slice := ReverseByteArr2(mod_slice) fmt.Println(ret_mod_slice) return string(ret_mod_slice) } // byte数组进行反转方式1 func ReverseByteArr(b []byte) []byte{ for i:=0; i<len(b)/2;i++ { b[i],b[len(b)-1-i] = b[len(b)-1-i],b[i] } return b } // byte数组进行反转方式2 func ReverseByteArr2(b []byte) []byte{ for i,j:=0,len(b)-1;i<j;i,j = i+1,j-1{ b[i] ,b[j] = b[j],b[i] } return b }
  • 解码
// base58解码 func Base58Decoding(src string) string{ // 转成byte数组 src_byte := []byte(src) //fmt.Println(src_byte) // 这里得到的是十进制 ret := big.NewInt(0) for _, b := range src_byte { //fmt.Println(b) i := bytes.IndexByte(b58,b) fmt.Println(i) // 乘回去 ret.Mul(ret,big.NewInt(58)) // 相加 ret.Add(ret,big.NewInt(int64(i))) } return string(ret.Bytes()) }

1607人已阅读,今天你学习了吗?

添加新回复