Изменение типа строки в байтовом типе в 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