Разница в поведении struct.unpack в Python 2.7 против 3.6 - PullRequest
3 голосов
/ 06 января 2020

Я конвертирую кодовую базу из Python 2.7 в Python 3.6. У меня есть этот код:

import struct 

unpacked = struct.unpack('<BI6s', '\x02\xff\x01\x00\x00tester', offset=0)

In Python 2.7, unpacked = (2, 511, 'tester'), что я и хочу.

В Python 3.6, поскольку struct.unpack ожидает, что второй аргумент будет bytes, я попытался сделать следующее:

import struct 

unpacked = struct.unpack('<BI6s', bytes('\x02\xff\x01\x00\x00tester', 'utf8'), offset=0)

И unpacked = (2, 114627, b'\x00teste').

Почему я получаю другой результат и как я получаю тот же результат, что и в 2.7?

1 Ответ

4 голосов
/ 06 января 2020

Проблема заключается в bytes() вызове:

>>> bytes('\x02\xff\x01\x00\x00tester', 'utf8')
b'\x02\xc3\xbf\x01\x00\x00tester'

См. Дополнительные байты \xc3\xbf? Python 3 строки являются Unicode, и кодировка UTF-8 для второго символа в вашей строке (U+00FF) составляет 0xC3 0xBF (см. https://www.compart.com/en/unicode/U+00FF).

Решение должен использовать байтовый литерал, который имеет то же поведение, что и Python 2:

unpacked = struct.unpack('<BI6s', b'\x02\xff\x01\x00\x00tester', offset=0)
...