Преобразование 2,5-байтовых сравнений в 3

Пытаюсь конвертировать программу 2.5 на 3.

Есть ли способ в python 3 изменить байтовую строку, например b '\ x01 \ x02' на строку стиля python 2.5, например '\ x01 \ x02', чтобы сравнение строк и побайтов работало аналогично до 2,5? Я читаю строку из двоичного файла.

У меня есть программа 2.5, которая считывает байты из файла, а затем сравнивает или обрабатывает каждый байт или комбинацию байтов с указанными константами. Чтобы запустить программу под 3, я бы не хотел менять все мои константы на байты и байтовые строки ('\ x01' на b '\ x01'), а затем решать проблемы в 3, такие как:

a = b'\x01'
b = b'\x02'

приводит к

(a+b)[0] != a

хотя аналогичные операции работают в 2.5. Мне нужно сделать (a + b) [0] == ord (a), а a + b == b '\ x01 \ x02' работает нормально. (Кстати, что мне делать с (a + b) [0], чтобы оно было равно a?)

Распаковка структур также является проблемой.

Я упустил что-то простое?


person foosion    schedule 19.09.2009    source источник


Ответы (1)


Байты - это неизменяемая последовательность целых чисел (в диапазоне от 0 ‹= до‹ 256), поэтому, когда вы обращаетесь к (a+b)[0], вы получаете обратно целое число, точно такое же, которое вы получили бы при доступе к a[0]. поэтому, когда вы сравниваете последовательность a с целым числом (a+b)[0], они, естественно, разные.

используя нотацию среза, вы можете вернуть последовательность:

>>> (a+b)[:1] == a         # 1 == len(a) ;)
True

потому что нарезка возвращает объект байтов.

Я бы также посоветовал запустить утилиту 2to3 (ее нужно запускать с py2k) для автоматического преобразования некоторого кода. Это не решит всех ваших проблем, но очень поможет.

person SilentGhost    schedule 20.09.2009
comment
›› поэтому, когда вы сравниваете последовательность a с целым числом (a + b) [0], они, естественно, разные. ›› За исключением того, что этого не было для аналогичных элементов в 2.5. Я понимаю, почему это имеет смысл в контексте py3k, но делает преобразование утомительным - person foosion; 20.09.2009
comment
2to3 (запускаемый под py3k) был полезен для добавления скобок в операторы печати. Он ничего не сделал для проблем с байтами и строками, для которых было бы неплохо найти общее решение. - person foosion; 20.09.2009