import re
def Str_encode(s:str,rule='utf-8'):
'''
将明文字符串按照rule的格式转化为01字符串
:param s: 待编码字符串
:param rule: 编码方案 默认utf-8
:return: 字符串对应01字符串
'''
sc=s.encode(rule)
bc=[bin(int(i))[2:].rjust(8,'0') for i in sc ]
rtn=''.join(bc)
return rtn
首先将字符串s编码,返回一个bytes类型sc。对于bytes类型,当你尝试解包时,你会获得这一字节的整数(0~255)然后通过bin函数将其转换成二进制字符串形式,但是bin方法返回的字符串首先开头是’0b’其次他的第一位必定为1,会吞掉在此之前的0,我们用一个右对齐rjust()在前面填零。
最后的join起到一个字符串拼接的作用。
PS:这个函数体的int(i)其实有点多此一举了,可以删掉
import re
def Str_decode(s:str,rule='utf-8'):
'''
将01字符串(不加任何标识符和纠错码)转化为对应的明文字符串(默认UTF-8)
:param s:01字符串
:return:解码原文
'''
if len(s)==0:
return '>>内容为空<<'
if len(s)%8!=0:
raise SyntaxError('编码不是八的倍数')
#至少是字节的倍数才能操作
msg=re.sub(r'0x','',hex(int(s,2)))
rtn=bytes.fromhex(msg).decode(rule)
return rtn
解码也很简单。首先将输入的01字符串利用int函数转化为int形式,然后再用hex()函数将其转换成十六进制。hex()函数的返回值是字符串,但是开头必定有’0x’,所以我们顺便把’0x’删了,好方便下一步操作。然后利用bytes.fromhex()函数输入一个十六进制的字符串组,将其转化为bytes格式。然后通过decode()函数将其解码出来。
博主就想随便记录一下我的学习历程,如果对大家有帮助就点个赞让我知道。要是觉得做的不好可以在评论提出改进的策略。我们未来再会(逃