经典分享 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进制介面, 好生感慨, 现在还见过这的怕不多了。
00 -
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))
00 -
7七月
2017-10-28
看的头疼。。。
00
相似问题