int与bytes的转换

2019年10月24日 / 36次阅读 / Last Modified 2019年10月24日
数值计算

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 "<stdin>", line 1, in <module>
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 --

本文链接:https://www.pynote.net/archives/1383

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top