Случайно переворачивая биты в двоичной строке Python

Я создаю некоторые нечеткие тесты в python, и для меня было бы неоценимо иметь возможность, учитывая двоичную строку, случайным образом перебрасывать некоторые биты и гарантировать, что исключения корректно возбуждаются, или результаты правильно отображаются для небольших изменений в заданных допустимых двоичных файлах, Кто-нибудь знает, как я могу сделать это в Python? Я понимаю, что это довольно тривиально в языках более низкого уровня, но по рабочим причинам мне сказали сделать это в Python, но я не уверен, как начать это или получить двоичное представление чего-то в Python. Любые идеи о том, как выполнить эти fuzz-тесты в Python?

2 ответа

Решение

Строки являются неизменяемыми, поэтому для внесения изменений первое, что нужно сделать, - это, вероятно, преобразовать их в список. В то же время, вы можете конвертировать цифры в целые, чтобы упростить манипуляции.

hexstring = "1234567890deadbeef"
values = [int(digit, 16) for digit in hexstring]

Затем вы можете перевернуть отдельный бит в любую из шестнадцатеричных цифр.

digitindex = 2
bitindex = 3
values[digitindex] ^= 1 << bitindex

При необходимости вы можете затем преобразовать обратно в гекс.

result = "".join("0123456789abcdef"[val] for val in values)

Одна вещь, которую вы можете попробовать - преобразовать строку в байтовый массив, а затем выполнить битовые манипуляции с каждым символом. Вы можете получить доступ к каждому символу по индексу и рассматривать его как целое число.

Например:

>>> a = "hello world"
>>> b = bytearray(a)
>>> b[0] = b[0] ^ 5    # bitwise XOR
>>> print b            # or do str(b) to convert it back to a string
mello world

Вы также можете найти эту статью в Python вики о битовых манипуляциях полезной. В нем подробно рассматриваются манипуляции с битами в Python, а также множество полезных советов и приемов.

Другие вопросы по тегам