Как преобразовать двоичный код в строку в python

54
5

Для проектов 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

спросил(а) 2017-08-20T15:34:00+03:00 2 года, 10 месяцев назад
1
Решение
55

Вы можете использовать binascii.unhexlify если это небольшая 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'

ответил(а) 2017-08-20T16:11:00+03:00 2 года, 10 месяцев назад
39

Другая возможность заключается в использовании 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@'

Существует также возможность указать endianess. И, конечно, делать противоположную операцию (распаковка).

ответил(а) 2017-08-20T17:14:00+03:00 2 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема