前言
最近在做题遇到一些很捉鸡的事情,在编码转化上卡了很久,因此特就常见的编码做一个总结。
python中比较常见的两个编码转化模块binascii和libnum
一、16进制转化为字符串
import binascii
from libnum import n2s,s2n
还是由繁到简的顺序来说一下。
binascii模块中常用的binascii.hexlify()和binascii.unhexlify() 16进制和字符串之间的相互转化,其实就是ASCII的转化
flag="test"
print binascii.hexlify(flag) #74657374
但是将16进制转化为字符串时要注意,不能直接
hflag=74657374
print binascii.unhexlify(hflag) #错误示例
binascii.unhexlify()接受的是一个16的字符串。
hflag=74657374
print binascii.unhexlify(str(hflag)) #test
如果不使用binascii模块也可以。
flag="test"
print flag.encode("hex") #74657374
print hflag="74657374".decode("hex") #test
使用字符串内嵌的函数也可以进行转化。
如果需要进行整数的转化,则必须先将整数转化为16进制后才可以
二、10进制16进制转化
print int("74657374",16) #1952805748
print hex(1952805748) #0x74657374
int()可以将字符串用base进制解析,转化为10进制整数
hex()将整数转化为16进制
字符串和整形可以使用str()和int()进行快速的变化
三、libnum模块的使用
如果我们已知一串10进制数字
iflag=1952805748
print n2s(iflag) #test
print s2n("test")#1952805748
如果这时非要使用binascii模块就会比较麻烦
print binascii.unhexlify(hex(iflag)[2:]) #test
如果iflag长度很长那么需要使用[2:-1]进行分片
总结
反正平时多去练,编码转化的方式有很多,找一种合适自己习惯的。