在 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'>
我该怎么做才能将类型更改为字节类型?
您没有更改类型,而是为变量分配了不同的值。
您还遇到了 python 2.x 和 3.x 之间的根本区别之一;大大简化了 2.x 类型unicode
已替换str
类型,它本身已重命名为bytes
. 它恰好可以在您的代码中工作,因为最近版本的 Python 2 添加bytes
了别名,str
以简化编写在两个版本下都可以工作的代码。
换句话说,您的代码按预期工作。
我该怎么做才能将类型更改为字节类型?
你不能,在 Python 2.7 中没有像 'bytes' 这样的类型。
来自 Python 2.7 文档(5.6 序列类型):“有七种序列类型:字符串、Unicode 字符串、列表、元组、字节数组、缓冲区和 xrange 对象。”
来自 Python 3.2 文档(5.6 序列类型):“有六种序列类型:字符串、字节序列(字节对象)、字节数组(字节数组对象)、列表、元组和范围对象。”
在 Python 2.x 中,bytes
只是 的别名str
,所以一切都按预期工作。此外,您不会在此处更改任何对象的类型——您只是将名称重新绑定x
到不同的对象。
可能不完全是您需要的,但是当我需要获取字节 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
只是一个例子来强调将常规字符串转换为二进制字符串并返回的过程:
sb = "a0" # just string with 2 characters representing a byte
ib = int(sb, 16) # integer value (160 decimal)
xsb = chr(ib) # a binary string (equals '\xa0')
现在倒退
back_sb = xsb.encode('hex')
back_sb == sb # returns True