对于infosec项目,我使用字符串作为一种字节数组。这通常在漏洞测试中完成。在构建字节数组时,我想连接可打印的字符和不可打印的字符。
这不是转换问题,我真的想要转换类型。我可以围绕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
答案 0 :(得分:1)
如果在字符串中键入转义的十六进制数字有点麻烦,可以使用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'
答案 1 :(得分:1)
另一种可能性是使用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'
您可以打包长整数,有符号或无符号或双浮点数等。 例如,这里填充为double的相同十六进制值:
>>> 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@'
还有可能指定结束。当然,要做相反的操作(解包)。