C语言编程,一个int一般就是4个byte,使用&符号获取int变量的地址,就可以得到各个byte。而python不太一样,C编程看到的全是内存和地址,python编程更抽象,也更简单,不让我们去看底层的内存和地址,仅仅是对各种对象的操作。
bytes转换成int
int对象中有一个class method,专门用来从bytes对象到int对象:
>>> int.from_bytes(b'\xF1\x02\x03\x04', 'big')
4043440900
>>> int.from_bytes(b'\xF1\x02\x03\x04', 'big', signed=True)
-251526396
signed参数表示这个bytes对应的是有符号的数,或者无符号的int。
python不是C,int对象不受4个字节长度的限制:
>>> int.from_bytes(b'\xFF\xFF\xFF\xFF', 'big')
4294967295
>>> int.from_bytes(b'\xFF\xFF\xFF\xFF\x01\x02\x03\x04', 'big')
18446744069431493380
big参数表示的是字节序,分大段(big),也是网络序,即高字节位于低地址,另一个是小端(little),即高字节在高地址,x86 CPU使用的就是小端字节序。文本代码中使用b开头的bytes对象表达式,都是big模式。
>>> int.from_bytes(b'\xF1\x02\x03\x04', 'big')
4043440900
>>> int.from_bytes(b'\xF1\x02\x03\x04', 'little')
67306225
int转换成bytes
int对象有一个成员函数 to_bytes,可以用来将自己转换成bytes对象。
>>> (123).to_bytes(4, 'big')
b'\x00\x00\x00{'
>>> (123).to_bytes(4, 'little')
b'{\x00\x00\x00'
to_bytes函数第1个参数表示得到的bytes对象的长度,第2个参数表示字节序。同样,这个转换函数也有signed参数。如果参数不对,会有OverflowError异常抛出:
>>> (168).to_bytes(1, 'big', signed=False)
b'\xa8'
>>> (168).to_bytes(2, 'big', signed=True)
b'\x00\xa8'
>>> (168).to_bytes(1, 'big', signed=True)
Traceback (most recent call last):
File "", line 1, in
OverflowError: int too big to convert
第1个参数length,其实可以用比较大的数,然后用前面的0x00来判断,这个int转换成bytes后,需要多少个字节:
>>> (123456789).to_bytes(10, 'big')
b'\x00\x00\x00\x00\x00\x00\x07[\xcd\x15'
python做int和bytes的转换,就简单介绍如上。
-- EOF --