python 打印 bytes 以 16 进制形式显示

0x00 引子

在将 int64 的数据以大端序转化为 bytes 后,输出的结果被当 ascii 码转义了,情况如下:
55e67e47.png
(注:上为 正确结果,下为 转义结果)

0x01 解决方法

对原字符串进行取消转义的操作即可,例如原始内容为 b'\x5c\x35\xba\x2c',只需要变为双反斜线就能达到取消反斜线转义的效果,这样输出b'\\x5c\\x35\\xba\\x2c' 即可得原始内容。

0x02 代码实现

1
2
3
def trans(s):
return "b'%s'" % ''.join('\\x%.2x' % x for x in s)
print(trans(bytes([92,53,186,44 ])))

0x03 打包成 IPython 插件

将下列文件放入 %PYTHON_INSTALLION_DIR%\Libs\site-packages\allhex 中。

init.py

1
2
3
4
5
6
7
8

'''
to load allhex any where
copy allhex.py and __init__.py to folder"~/.local/lib/python3.7/site-packages/allhex/"
(3.7 is your python version)
'''

from .allhex import *

allhex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# allhex.py

'''
use"%load_ext allhex"to load it
use"%unload_ext allhex"to unload it
to load it automatically, add
`get_ipython().run_line_magic('load_ext','allhex')`
to your ~/.ipython/profile_default/startup/load_extensions.py
'''

def load_ipython_extension(ipython):
formatter = ipython.display_formatter.formatters['text/plain']

def _repr(obj, p, cycle):
s = "b'" + (''.join(f'\\x{c:02x}' for c in obj)) + "'"
p.text(s)

formatter.for_type(bytes, _repr)

def unload_ipython_extension(ipython):
formatter = ipython.display_formatter.formatters['text/plain']

formatter.for_type(bytes, lambda obj, p, cycle: p.text(str(obj)))

ipython中使用 %load_ext allhex 载入即可!





root@kali ~# cat 重要声明
本博客所有原创文章,作者皆保留权利。转载必须包含本声明,保持文本完整,并以超链接形式注明出处【Techliu】。查看和编写文章评论都需翻墙,为了更方便地获取文章信息,可订阅RSS,如果您还没有一款喜爱的阅读器,不妨试试Inoreader.
root@kali ~# Thankyou!