Изменение типа строки в байтовом типе в Python 2.7

В python 3.2 я могу легко изменить тип объекта. Например:

x=0
print(type (x))
x=bytes(0)
print(type (x))

это даст мне следующее:

<class 'int'>
<class 'bytes'>

Но, в python 2.7, кажется, что я не могу использовать тот же способ для этого. Если я сделаю тот же код, он даст мне следующее:

<type 'int'>
<type 'str'>

Что я могу сделать, чтобы изменить тип в тип байтов?

Ответ 1

Что я могу сделать, чтобы изменить тип в тип байтов?

Вы не можете, такого типа, как "байты" в Python 2.7, не существует.

Из документации Python 2.7 (5.6 Типы последовательностей): "Существует семь типов последовательностей: строки, строки Unicode, списки, кортежи, bytearrays, буферы и объекты xrange."

Из документации Python 3.2 (5.6 Типы последовательностей): "Существует шесть типов последовательностей: строки, байтовые последовательности (байтовые объекты), массивы байтов (объекты bytearray), списки, кортежи и объекты диапазона."

Ответ 2

Вы не меняете типы, вы назначаете другое значение переменной.

Вы также сталкиваетесь с одним из фундаментальных различий между python 2.x и 3.x; грубо упрощенный тип 2.x unicode заменил тип str, который сам был переименован в bytes. Это происходит в вашем коде, поскольку более свежие версии Python 2 добавили bytes в качестве псевдонима для str, чтобы облегчить написание кода, который работает в обеих версиях.

Другими словами, ваш код работает как ожидалось.

Ответ 3

В Python 2.x, bytes является просто псевдонимом для str, поэтому все работает так, как ожидалось. Более того, вы не меняете тип каких-либо объектов здесь - вы просто переписываете имя x на другой объект.

Ответ 4

Может быть, не совсем то, что вам нужно, но когда мне нужно было получить десятичное значение байта d8 (это был байт, дающий смещение в файле), я сделал:

a = (data[-1:])          # the variable 'data' holds 60 bytes from a PE file, I needed the last byte
                         #so now a == '\xd8'  , a string
b = str(a.encode('hex')) # which makes b == 'd8' , again a string
c = '0x' + b             # c == '0xd8' , again a string
int_value = int(c,16)    # giving me my desired offset in decimal: 216

                         #I hope this can help someone stuck in my situation