如何在 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@'
也可以指定字节顺序。当然,还要进行相反的操作(拆包)。
对于信息安全项目,我使用字符串作为一种字节数组。这通常在漏洞测试中完成。在构建字节数组时,我想连接可打印字符和不可打印字符。
这不是转换的问题,我真的很想转换类型。我可以围绕 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@'
也可以指定字节顺序。当然,还要进行相反的操作(拆包)。