经典分享 hexa = b' '.join(['%0*X' % (digits, ord(x)) for x in s])

来源:14-9 装饰器的副作用

runzx

2017-10-27

真是简洁, 给同学们共享:

hexa = b' '.join(['%0*X' % (digits, ord(x)) for x in s])

不过是不是可读性差了些? 得不偿失?

写回答

3回答

runzx

提问者

2017-10-28

终于调试通,看到熟悉的16进制介面, 好生感慨, 现在还见过这的怕不多了。

//img.mukewang.com/szimg/59f49e16000177dc10860562.jpg

0
0

runzx

提问者

2017-10-28

如果s=' this is str for test 你好!', 这句就能生成下面的 16进制输出。 这要是让我写不得20句左右才搞得定?


0000 0074 0068 0069 0073 0020 0069 0073 0020 0073 0074 0072 0020 0066 006F 0072 0020  this is str for

0010 0074 0065 0073 0074 0020 4F60 597D FF01                                          test 你好!

把此函数完整附上: 

def hexdump(src, length=16):
    '''16进制导出函数'''
    result = []
    # python2 unicode 在python3 为 str
    digits = 4 if isinstance(src, str) else 2
    # python3 取消了xrange, 它返回迭代对象
    for i in xrange(0, len(src), length):
        s = src[i:i+length]
        hexa = ' '.join(['%0*X' % (digits, ord(x)) for x in s])
        # zx 加入or ord(x) > 0xff , 为了显示汉字
        text = ''.join([x if 0x20 <= ord(x) <0x7f or ord(x) > 0xff else '.' for x in s])
        result.append('%04X %-*s %s' % (i, length*(digits+1), hexa, text))
    print('\n'.join(result))

python3中要自己写个xrange()

def xrange(start, stop, step):
'''
   python3 取消了xrange, 它返回迭代对象
   与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器。
   range()返回一个递增或递减的数字列表
       start表示列表开始的值,默认为“0”。
       stop 表示列表结束的值,该参数不可缺少
       参数step表示步长,默认值为“1”。
   xrange 是一个类,返回的是一个xrange对象。
       使用xrange()进行遍历,每次遍历只返回一个值。range()返回的是一个列表,一次性计算并返回所有的值。因此,xrange()的执行效率要高于range()
       
   '''
    return iter(range(start, stop, step))


0
0

7七月

2017-10-28

看的头疼。。。

0
0

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14598 学习 · 4470 问题

查看课程