Python16进制与字符串的转换
电脑上装了Python2.7和3.3两个版本,平时运⾏程序包括在Eclipse⾥⾯调试都会使⽤2.7,但是由于某些原因在cmd命令⾏中输⼊python得到的解释器则是3.3,
⼀直没对此做处理,因为这样可以对两个版本的差异有⼀个测试,⽽且虚拟机⾥⾯是2.7以下的版本。
今天想到需要⼏个脚本做常⽤的编码转换,这样在没有其他⼯具的情况下也可以进⾏转换,不多说上正⽂:
⾸先是2.7版本下:
2.7版本下进⾏转换还是很⽅便的,hex2char:output = 'data'.decode('hex')
char2hex: output = '64617461'.encode('hex')
真的是只需要⽤到字符串的decode和encode⽅法就Ok了,因此,因此如果我需要在命令⾏下运⾏,可以这样写:
import sys
choose = sys.argv[1]
data = sys.argv[2]
def hex2char():
output = data.decode('hex')
print output
def char2hex():
output = de('hex')
print output
print "Usage: <filename> <hex2char or char2hex> <your data>"
if len(sys.argv) == 3:
if choose.lower() == 'hex2char':
hex2char()
if choose.lower() == 'char2hex':
char2hex()
if choose.lower()!='hex2char' and choose.lower()!='char2hex':
print "Wrong param,try again"
else:
print "Wrong number of params,check your input\n"
#this script has passed the test
这段代码在2.7的环境下测试已经通过,可以进⾏⼗六进制与字符串之间的转换,如果觉得还不太好⽤,可以对代码进⾏修改修改
但是在3.0以上环境有很多⽤法则是不再被⽀持的,如果使⽤de('hex'),则会报错:
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
'data'.encode('hex')
LookupError: unknown encoding: hex
有些⼈可能会说'hex'应该为"hex",或者说遇到没有()的情况,实际上Python中单引号和双引号是没什么区别的,例如:
ord('a')==97 ,ord("a")==97都是成⽴的
然后是3.0以上环境:
3.0环境⽐较常⽤的是binascii模块,关于这个模块的⼀些函数和⽅法可以查⼿册,这⾥且说对于⼗六进制和字符串的转换
先贴代码:
def hex2char(data):
# binascii.a2b_hex(hexstr)
output = binascii.unhexlify(data)
print(output)
def char2hex(data):
data = b'data'
# binascii.b2a_hex(data)
output = binascii.hexlify(data)
python虚拟机print(output)
这两个函数与上述代码有着相同的功能,代码中有两⾏注释,表明binascii.a2b_hex(hexstr)和binascii.unhexlify(hexstr)在功能上是等价的,另⼀个同样
这⾥⼗六进制转字符串直接调⽤就可以了,但是当直接使⽤output = binascii.hexlify(data)时则报错了,对此函数munuals的说法是:
Return the hexadecimal representation of the binary data. Every byte of data is converted into the co
rresponding 2-digit hex representation. The resulting string is therefore twice as long as the length of data
因此对传⼊的参数必须申明是byte of data,刚开始没有想到,不知怎么处理,后来想到b'string data'类似于r'string data'(原始字符串,在使⽤windows路径时,r'..\path'可以不需要对反斜线转义),于是有了:
data = b'data'
output = binascii.hexlify(data)
于是问题便愉快的解决了,同样可以进⾏转换
另外在2.7中,binascii模块可以使⽤,output = binascii.hexlify(data)直接就可以投⼊使⽤,不必data = b'data'处理,这也是不同版本之间显著的区别,2.7的
⼀些功能⽤起来更上⼿,但是3.0版这么做也是出于某种需要
再给⼏个进制转换的例⼦:
int('bf',16) 将16进制数bf转为10进制数,把16改为8或2就对于不同的进制
hex(num),把hex换成bin或oct就对应于⼆进制数和⼋进制了
看到有⼀段不错的不错进制转换的代码:
import os,sys
# global definition
# base = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F]
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
# bin2dec
# ⼆进制 to ⼗进制: int(str,n=10)
def bin2dec(string_num):
return str(int(string_num, 2))
# hex2dec
# ⼗六进制 to ⼗进制
def hex2dec(string_num):
return str(int(string_num.upper(), 16))
# dec2bin
# ⼗进制 to ⼆进制: bin()
def dec2bin(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 2)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
完整代码见
最后再给出Ascii码和整数转换的函数:
chr()函数以⼀个Ascii码作为参数,返回对应的整数
ord()函数则刚好与chr()相反,返回对应Ascii码,如果参数超过Ascii码表⽰范围则返回对应的unicode值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论