Преобразование 2,5-байтовых сравнений в 3 - PullRequest
2 голосов
/ 20 сентября 2009

Я пытаюсь преобразовать программу 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?)

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

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

1 Ответ

3 голосов
/ 20 сентября 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...