使用Python将Hex转换为可读字符串

时间:2017-10-31 09:11:27

标签: python

当我执行以下查询时:

SELECT HEX(FILL),ID FROM dbo.table WHERE FILL <> ''

它给我以下结果:

404040404040404000000F40404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040

当我像这样修改我的查询时

SELECT FILL,ID FROM dbo.table WHERE FILL <> ''

我得到的结果如图所示:

enter image description here

使用此网址进行转换:https://codebeautify.org/hex-string-converter

上述网址未给出正确的预期结果。所以我使用了Python。

这是我的python代码转换为可读格式:

import base64
hex_data   ='404040404040404000000F40404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040'
ascii_string = str(base64.b16decode(hex_data))[2:-1]
print (ascii_string)

我得到的结果是:

@@@@@@@@\x00\x00\x0f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

如何使字符串可读(我想读简单的英文字符)?

2 个答案:

答案 0 :(得分:0)

您通过将bytes value传递给str()来修改SI (shift-in)。 通过bytes对象传递str(),您可以生成字节对象的表示。表示也是一个字符串也是巧合。

您最多可以使用解码方法解码字节到文本:

bytes_object = base64.b16decode(hex_data)
text_object = bytes_object.decode('latin1')

我使用Latin-1(ISO-8859-1)来解码数据,因为它可能不是ASCII数据。大多数ASCII文本开头都不使用NULL或live example字节。 ASCII也可以工作,但只要你有超出0x00-0x7F范围的任何数据,你就会收到错误。

您找到的十六进制字符串转换器也包含NULL和SI字节,但它们不可打印,因此您的浏览器不会显示它们。如果您使用print(),则很可能您的终端也不会显示它们:

>>> import base64
>>> hex_data   ='404040404040404000000F40404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040'
>>> bytes_object = base64.b16decode(hex_data)
>>> text_object = bytes_object.decode('latin1')
>>> text_object
'@@@@@@@@\x00\x00\x0f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'
>>> print(text_object)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

答案 1 :(得分:-1)

尝试binascii.unhexlify()

>>> binascii.unhexlify('404040404040404000000F40404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040')
'@@@@@@@@\x00\x00\x0f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'

当然,您也可以将查询更改为而不是十六进制编码字段:

SELECT FILL,ID FROM dbo.table WHERE FILL <> ''

这似乎是一个更好的解决方案。