您的位置:首页 > 编程语言 > Python开发

base92解码(python3实现base92加解码)

2020-02-03 04:14 2061 查看

base92解码(python3实现base92加解码)

起因

之前由于更新python3,导致了base92原作者的模块无法兼容python3,网上找了好多解决方法,均为找到python3相关的base92模块,看到原作者写的python2的base92模块最新的已经使7年前了,并且未找到兼容python3的,于是突发奇想,改造了下原python2的代码,新打包成了python3版本的base92包,仅供学习交流用。

项目地址

下载地址

维护

由于该修改未打算作为项目目的,仅用作学习交流和小程序使用,所以没有发布到PyPi,大家如果有西纳想用的小伙伴需要自行去Github下载,然后离线安装,无法用pip install
并且在未影响到常规用的情况下不打算做更多完善,需要用于发行项目的小伙伴可以去支持原作者

安装方法:

  1. 下载完毕后找到 py3base92_setup 文件夹打开
  2. windows下直接双击 install.bat 即可安装,或者进入到该目录然后运行 python setup.py install 即可
  3. linux下安装直接进入到setup.py存在的目录然后执行python setup.py install 即可
  4. 安装完毕后用 import py3base92 语句导入模块测试,若无报错即安装成功

使用方法

函数:
b92encode() / encode() / base92_encode() 等价
b92decode() / decode() / base92_decode() 等价

样例代码:

import py3base92
print(py3base92.encode("test"))
print(py3base92.b92encode("test"))
print(py3base92.base92_encode("test"))
print(py3base92.decode("Jw_@V"))
print(py3base92.b92decode("Jw_@V"))
print(py3base92.base92_decode("Jw_@V"))

目前已知问题

部分不可见字符及中文加解码会出现问题,常规使用不会出现影响

base92 alphabet:如下

!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}

测试样码通过率

alphabet 可视字符测试
样例通过率 100% (10000次随机测试)

##该样例通过率100%
if __name__=='__main__':
import random
sum=0
for i in range(10000):
randoms=random.randint(0,92)
strs=''.join(random.sample([' ','!','#','$','%','&','\'','(',')','*','+',',','-','.','/','0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?','@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','[','\\',']','^','_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','{','|','}'],randoms))
#print(type(strs))
result=encode(strs)
#print(result)
result2=base92_decode(result.replace('\\\\','\\'))
#print(result2)
if strs==result2:
#print("pass")
sum+=1
print("testNum:10000, pass:"+str(sum))

原作者样例测试代码(稍作修改,生成的范围未变,可以作为参考)
样例通过率 8% (10000次随机测试)
python3的主要是面向str型的可视字符,所以原测试样例通过率并不高

#该样例通过率约为8%
if __name__ == "__main__":
import doctest
doctest.testmod()

## more correctness tests
import hashlib
import random
def gen_bytes(s):
return hashlib.sha512(s).digest()[:random.randint(1,64)]
sum=0
for i in range(10000):
s = gen_bytes(str(random.random()).encode())
if type(s)==type(b'aa'):
result=encode(s)
#print(result)
result2=base92_decode(result.replace('\\\\','\\'))
#print(result2)
if s!=result2.encode():
#print("error")
sum+=1
else:
result=encode(s)
#print(result)
result2=base92_decode(result.replace('\\\\','\\'))
#print(result2)
if s!=result2:
#print("error")
sum+=1
print(sum)

测试结论,尽可能避免bytes类型使用,str类型可满足使用。

  • 点赞 2
  • 收藏
  • 分享
  • 文章举报
Gu_fcsdn 发布了4 篇原创文章 · 获赞 2 · 访问量 218 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: