Случайно переворачивая биты в двоичной строке 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, а также множество полезных советов и приемов.