什么是base62编码,和base64有什么区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是base62编码,和base64有什么区别相关的知识,希望对你有一定的参考价值。

参考技术A 在网上冲浪的时候,阅读技术文章有时候会看到base62,你可能会问这个base62和base64有什么区别?base62有什么用,难道就是64-62=2的区别?
你还真说对了,与base64编码不同的是去除了两个符号,使得码空间由数字和英文字母组成,一般在短网址应用中会用到,下面列出几个语言的base62实现。
Javascript版
var Base62 = arr : new Array('v', 'P', 'h', '7', 'z', 'Z', 'w', 'A', '2', 'L', 'y', 'U', '4', 'b', 'G', 'q', '5', 't', 'c', 'V', 'f', 'I', 'M', 'x', 'J', 'i', '6', 'X', 'a', 'S', 'o', 'K', '9', 'C', 'N', 'p', '0', 'O', 'W', 'l', 'j', 'Y', 'T', 'H', 'Q', '8', 'R', 'E', 'n', 'm', 'u', '3', '1', 'B', 'r', 'd', 'g', 'e', 'D', 'k', 'F', 's'), log10 : function(x) return Math.log(x)/Math.log(10) , encode : function(str) var out = ''; for(var t = Math.floor(this.log10(str)/this.log10(62)); t>=0; t--) var a = Math.floor(str / Math.pow(62, t)); out += this.arr[a] str = str - (a * Math.pow(62, t)); return out; , decode : function(str) var out = 0; var len = str.length - 1; for(var t = 0; t <= len; t++) out = out + this.arr.indexOf(str.substr(t,1)) * Math.pow(62, len - t); return out; document.write(Base62.encode(10010));
C#版base62
public static class Base62 private static string Alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static String Encoding(ulong num) if (num < 1) throw new Exception("num must be greater than 0."); StringBuilder sb = new StringBuilder(); for (; num > 0; num /= 62) sb.Append(Alphabet[(int)(num % 62)]); return sb.ToString(); public static ulong Decoding(String str) str = str.Trim(); if (str.Length < 1) throw new Exception("str must not be empty."); ulong result = 0; for (int i = 0; i < str.Length; i++) result += (ulong)(Alphabet.IndexOf(str[i]) * Math.Pow(62, i)); return result;
Java版base62
public static StringBuffer encodeBase62(byte[] data)
StringBuffer sb = new StringBuffer(data.length * 2);
int pos = 0, val = 0;
for (int i = 0; i < data.length; i++)
val = (val << 8) | (data[i] & 0xFF);
pos += 8;
while (pos > 5)
char c = encodes[val >> (pos -= 6)];
sb.append(
/**/c == 'i' ? "ia" :
/**/c == '+' ? "ib" :
/**/c == '/' ? "ic" : c);
val &= ((1 << pos) - 1);


if (pos > 0)
char c = encodes[val << (6 - pos)];
sb.append(
/**/c == 'i' ? "ia" :
/**/c == '+' ? "ib" :
/**/c == '/' ? "ic" : c);

return sb;


public static byte[] decodeBase62(char[] data)
ByteArrayOutputStream baos = new ByteArrayOutputStream(data.length);
int pos = 0, val = 0;
for (int i = 0; i < data.length; i++)
char c = data[i];
if (c == 'i')
c = data[++i];
c =
/**/c == 'a' ? 'i' :
/**/c == 'b' ? '+' :
/**/c == 'c' ? '/' : data[--i];

val = (val << 6) | decodes[c];
pos += 6;
while (pos > 7)
baos.write(val >> (pos -= 8));
val &= ((1 << pos) - 1);


return baos.toByteArray();
本回答被提问者采纳
参考技术B

base64编码详解

base64 和 urlencode的区别

base64 和 urlencode的区别

base64
1、包含A-Z a-z 0-9 和加号“+”,斜杠“/” 用来作为开始的64个数字. 等号“=”用来作为后缀用途。
2、2进制的.
3、要比源数据多33%。
4、常用于邮件。

urlencode
除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)
在神马情况下用

json是有编码区别的 只支持utf-8
参考技术A 1.urlencode
url编码主要是为了解决一些url中的一些特殊字符和歧义字符或者中文字符的传输问题,举个Python代码例子

# -*- coding: utf-8 -*-
import urllib

#/url?广州=020
query = "广州":"020"
url = "/url?%s" % urllib.urlencode(query)
print url #编码后 /url/?%E5%B9%BF%E5%B7%9E=020
print urllib.unquote(url) #解码后 /url?广州=020

2.base64
理解成可逆加密算法,只能防肉眼看到真实内容,举个python代码例子:

# -*- coding: utf-8 -*-
import base64
s = "abc"
a = base64.b64encode(s) #编码
print a #编码后输出"YWJj"
print base64.b64decode(a) #解码后输出"abc"

3.sha1/md5
可以理解成不可逆加密算法,举个Python代码例子:
# -*- coding: utf-8 -*-
import hashlib
m = hashlib.md5()
m.update("password") #对"password"加密
print m.hexdigest() #输出"5f4dcc3b5aa765d61d8327deb882cf99"

以上是关于什么是base62编码,和base64有什么区别的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 实现 URL 安全的 Base62 转码

UTF8/UTF16和Base64在编码方面有啥区别

base64 和 urlencode的区别

为什么要使用base64编码,有哪些情景需求?

base64用法和使用场景

什么是BASE64编码?