设为首页 收藏本站
查看: 719|回复: 0

[经验分享] Python十六进制与字符串的转换

[复制链接]

尚未签到

发表于 2015-4-26 10:58:48 | 显示全部楼层 |阅读模式
  电脑上装了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 = data.encode('hex')
    print output
print "Usage:    "
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以上环境有很多用法则是不再被支持的,如果使用str.encode('hex'),则会报错:
  Traceback (most recent call last):
  File "", line 1, in
    '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)
    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 corresponding 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]])
  完整代码见http://www.iyunv.com/zhangpengshou/archive/2012/03/12/2392068.html
  最后再给出Ascii码和整数转换的函数:
  chr()函数以一个Ascii码作为参数,返回对应的整数
  ord()函数则刚好与chr()相反,返回对应Ascii码,如果参数超过Ascii码表示范围则返回对应的unicode值
  
  
  
  

  
  
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60826-1-1.html 上篇帖子: 使用Python控制IE访问网站 下篇帖子: Python框架之Django学习笔记(十二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表