如何在 python 中将二进制转换为字符串

How to cast binary into a string in python

对于信息安全项目,我使用字符串作为一种字节数组。这通常在漏洞测试中完成。在构建字节数组时,我想连接可打印字符和不可打印字符。

这不是转换的问题,我真的很想转换类型。我可以围绕 chr() 编写函数或方法,但必须有更好的方法。

>>> print "A"*10 + chr(0x20) + "B"*10
AAAAAAAAAA BBBBBBBBBB

例如,如果我要插入一个大的二进制数组怎么办?

>>> print "A"*10 + 0xBEEF + "B"*10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

>>> print "A"*10 + 0xBEEFBEEFBEEFBEEFBEEFBEEF + "B"*10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'long' objects

我可能在这里使用了错误的数据类型,因为我很确定我什至不能保证字符串有 8 位字节。


我希望的示例:

>>> print "A"*10 + 0xBEEFBEEFBEEFBEEFBEEFBEEF + "B"*10
AAAAAAAAAA������������BBBBBBBBBB

如果在字符串中输入转义的十六进制有点麻烦,您可以使用 binascii.unhexlify,例如:

from binascii import unhexlify

b = 'A'*10 + unhexlify('BEEF' * 6) + 'B'*10
# 'AAAAAAAAAA\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xefBBBBBBBBBB'

不过在 Python 3 中,您必须确保以字节字符串开头(否则您将收到 TypeError: Can't convert 'bytes' object to str implicitly):

b'A'*10 + unhexlify('BEEF' * 6) + b'B'*10
# b'AAAAAAAAAA\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xefBBBBBBBBBB'

另一种可能性是使用 struct 模块,这给了你更多的控制权 在输出上。这是一个 Python 2.7 示例:

import struct

s = struct.pack("6H", *[0xbeef]*6)

s 是以下字符串:

'\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe'

您可以打包长整数,有符号或无符号,或双浮点数等。 例如这里是相同的十六进制值打包成双打:

>>> struct.pack("6d", *[0xbeef]*6)
'\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@'

也可以指定字节顺序。当然,还要进行相反的操作(拆包)。