进制转换详解,二进制,十进制,八进制,十六进制,62进制,MD5加密,python代码示例

进制转换详解,二进制,十进制,八进制,十六进制,62进制,MD5加密,python代码示例

进制关系讲解:

1. 进制的产生:

1. 首先说一下十进制,这是我们最熟悉的进制体系,理论上也是我们人类最先接触的进制体系。
原因很简单,我们人都有十个手指头和十个脚指头。这天然的对称性,有着天然的数学规律在里面。
十进制是应用最广泛,也最常用的进制体系,但是进制体系并不只属于十进制。
第二个被发现,并广泛使用的是二进制,大概有和无,也是最先被明白的道理吧。
从二进制开始人类才算真正打开进制世界的大门,并且一发不可收拾。
比如:太极阴阳,八卦,摩尔斯密码,八进制,十六进制等等。

2. 进制原理:

进制实际上是一种数的认知和规律总结。
进制转换实际上就是一种数与数之间的对应关系。(这一点和加密原理一样)
既然是一种对应关系,那么一定存在某种我们人类认知的数学规则在里面。
最基础的知识就是符号,进位和减位。
比如:15-7=8
实质上就是5-7=-2+10=8:这个过程可以理解为5减7,不够向10借2,5+2=7,7-7=0
最后 10-2=8,这样 10 借出 2 之后还剩 8,15-7=8.
在减法的基础上,发展出除法,余数和商。除法,余数,商,这三个就是进位换算的数学基础。

3. 十进制举例:

	首先人为定义一个数字范围(符号)为:0,1,2,3,4,5,6,7,8,9
    再定义一个进位规则:逢十进一
    再定义一个显示的规则:向左进位
    举例说明:9+1=10
    9 已经是数字范围的最大值,再加 1,只能向上进位,个位数变成 0,十位数变成 1
	组合起来按照向左进位显示就是 10
    实际我们可以理解为每一个数的左边都有无数的 0 位存在
	如:0010,按照十进制理解是十, 10 前面的 0 被我们省略掉了而已。每一位可以显示 0~9 的值
	当位值达到9还要继续增加的时候,实际上就是向上进位,自身归 0,加法就是重复这个过程的规则
	最后得到一个固定的组合值,显示成一个数字,减法反之。
    能理解上面这段话,就基本上理解了进制规则和方法。
    举例:100,按照十进制,解读为:百位值:1,十位值:0,个位值:0
    100+100=200 的过程:百位值 1+1,十位 +0,个位 +0,最后显示为:200

python代码示例:

十进制转二进制:

# 二进制:
# 1. 数字范围:0,1
# 2. 进位规则:逢二进一
# 3. 显示规则:向左进位

NUM = ["0", "1"]	# 数字范围:0,1

def z2(func_num):	# 定义一个函数
    len_count = len(NUM)	# 得到进位规则的值
    result_value = []	# 定义一个空的列表用来放得到的新数据
    while func_num >= len_count:	# 循环比较当前的商是不是大于等于进位规则的值
        func_num,remain = divmod(func_num,len_count)	# 得到给定十进制数的商和余数
        result_value.append(NUM[remain])		# 把余数对应的数字范围值按顺序放进列表
    result_value.append(NUM[func_num])		# 把最后剩余的商对应的数字范围值放进列表
    result_value.reverse()		# 反转列表

    result = "".join(result_value)		# 把列表里的字符串拼接起来
    return result

test = z2(10)
print(test)

十进制转八进制:

# 八进制:
# 1. 数字范围:0~8
# 2. 进位规则:逢八进一
# 3. 显示规则:向左进位

NUM = ["0", "1", "2", "3", "4", "5", "6", "7"]

def z8(func_num):
    len_count = len(NUM)
    result_value = []
    while func_num >= len_count:
        func_num, remain = divmod(func_num, len_count)
        result_value.append(NUM[remain])
    result_value.append(NUM[func_num])
    result_value.reverse()

    result = "".join(result_value)
    return result

test = z8(10)
print(test)

十进制转十六进制:

# 十六进制:
# 1. 数字范围:0~F
# 2. 进位规则:逢十六进一
# 3. 显示规则:向左进位

NUM = ["0", "1", "2", "3", "4", "5", "6", "7","8","9","A","B","C","D","E","F"]

def z16(func_num):
    len_count = len(NUM)
    result_value = []
    while func_num >= len_count:
        func_num, remain = divmod(func_num, len_count)
        result_value.append(NUM[remain])
    result_value.append(NUM[func_num])
    result_value.reverse()

    result = "".join(result_value)
    return result

test = z16(10)
print(test)

十进制转62进制:

# 62进制:
# 1. 数字范围:0~9A~Za~z
# 2. 进位规则:逢62进一
# 3. 显示规则:向左进位

import string
import itertools
# 是在是不想写这个长列表了,string和itertools 模块,其实也就是把这些字符变成字符串,放进列表
NUM = list(itertools.chain(string.digits, string.ascii_uppercase, string.ascii_lowercase))

def z62(func_num):
    len_count = len(NUM)
    result_value = []
    while func_num >= len_count:
        func_num, remain = divmod(func_num, len_count)
        result_value.append(NUM[remain])
    result_value.append(NUM[func_num])
    result_value.reverse()

    result = "".join(result_value)
    return result

test = z62(10)
print(test)

结语:

可以看出,这些进制的本质都只是更换了数字范围和进位规则
于是通过十进制作为中间值,他们之间可以实现互相转换。
因为我们规定的向左进位的规则,导致左边的位值大于右边的位值
所以实际的排列顺序和除法的顺序刚好相反:
商>倒数第一个余数>倒数第二个余数>......>第一个余数。
加密本质上是定义了一个更深奥的数字范围和进位规则,或者显示规则。
加密和进制其实都只有一个作用就是让人看不懂(开玩笑的)。

最后贡献一段MD5的加密代码:

仅供参考:

MD5本质上是把我们认识的字符,通过哈希算法给隐藏起来,最后返回一个固定长度的字符串
这样解决了两个问题:
	1. 数字范围太短,容易被遍历算法破解,因为哈希算法加密的是字符串,理论上字符串无尽
	2. 密文太长,导致传输,携带,记忆等等的不方便
# 老规矩导模块,我写的手都快断了!
# 这个没加盐
import hashlib

def encrypt(origin):
    origin_bytes = origin.encode(‘utf-8‘)
    md5_object = hashlib.md5()
    md5_object.update(origin_bytes)
    return md5_object.hexdigest()

p1 = encrypt(‘admin‘)
print(p1) # "21232f297a57a5a743894a0e4a801fc3"

加盐版:

import hashlib

def encrypt(origin):
    salt = "盐"
    origin_bytes = origin.encode(‘utf-8‘)
    md5_object = hashlib.md5(salt.encode("utf-8"))   # 这个地方加盐
    md5_object.update(origin_bytes)
    return md5_object.hexdigest()

p1 = encrypt(‘admin‘)
print(p1) # "0956c330a0384f7daa08517619a940c5"

进制转换详解,二进制,十进制,八进制,十六进制,62进制,MD5加密,python代码示例

上一篇:java切换jdk版本出现的问题


下一篇:c++各种类型的字节数