在计算机进行数据交换时,常常会有一个进制转换的过程,有时候数据过于庞大,为了方便存储管理,计算机会使用十六进制存储数据,Python一般采用int类型是十进制,作为硬件行业采用Python处理二进制、十六进制数据成为必然。
一、pyhton 进制转换
1.1 十进制转为二、八、十六进制
方法一:函数直转
十进制转二进制:bin(10) --> '0b1010' tpye:是字符串类型 0b:表示2进制
十进制转八进制:oct(10) --> '0o12' tpye:是字符串类型 0o:表示8进制
十进制转十六进制:hex(10) --> '0xa' tpye:是字符串类型 0x:表示16进制
方法二:Format格式
>>> '{:b}'.format(9) --> '1001'
>>> '{:o}'.format(9) --> '11'
>>> '{:x}'.format(10) --> 'a'
两种方式会影响到打印,但是python还是可以识别出已转化的数据。
1.2 二、八、十六进制转为十进制
方法一:int()函数
int('0b1010',2) --> 10 或者 int('1010',2) --> 10
int('0o12',8) --> 10 或者 int('12',8) --> 10
int('0xa',16) --> 10 或者 int('a',16) --> 10
方法二:eval函数
>>> eval('1111') -->1111
>>> eval('0b1111') -->15
>>> eval('0o1111') -->585
>>> eval('0x1111') -->4369
(x,y)括号中x是需要转换的数值type必须是str字符串类型,y是当前进制数
1.3 将十进制转换为固定长度的多进制类型
方法一:Format
>>> '{:08b}'.format(9) -->'00001001'
>>> '{:06o}'.format(9) -->'000011'
>>> '{:06x}'.format(9) -->'000009'
备注:'{:08b}'.format(9) # :b表示转换为二进制,08表示高位用0补够8位
方法二:str.zfill
>>> a =bin(5)[2:]
>>> print(a) -->101
>>> c = str.zfill(a,8)
>>> print(c) -->00000101
>>> a =oct(9)[2:]
>>> print(a) -->11
>>> c = str.zfill(a,8)
>>> print(c) -->00000011
>>> a =hex(20)[2:]#去掉前面0b
>>> print(a) -->14
>>> a =hex(20)
>>> print(a) -->'0x14'
>>> str.zfill(a,8) -->'00000x14'
二、Python二进制单比特操作
硬件中对于二进制数据的单比特操作是很常见的,verilog中也将每一比特单独的信号线作为区分,可以单比特调用。Python中虽然二进制数据也区分比特,但是获取更改某一比特却没有直接函数,参考文档【3】编写读取、调用函数。
得到某个字节中某一位(Bit)的值
:param byte: 待取值的字节值
:param index: 待读取位的序号,从右向左0开始,0-7为一个完整字节的8个位
:returns: 返回读取该位的值,0或1
def get_bit_val(byte, index):
if byte & (1 << index):
return 1
else:
return 0
更改某个字节中某一位(Bit)的值
:param byte: 准备更改的字节原值
:param index: 待更改位的序号,从右向左0开始,0-7为一个完整字节的8个位
:param val: 目标位预更改的值,0或1
:returns: 返回更改后字节的值
def set_bit_val(byte, index, val):
if val:
return byte | (1 << index)
else:
return byte & ~(1 << index)