利用python进行二进制、十进制、十六进制相互转换和二进制移位操作

利用python进行二进制、十进制、十六进制相互转换和二进制移位操作

1 二进制与十进制相互转换

通过python自带int()函数将二进制转换成十进制数,二进制数在python中一般都是str字符串格式。

通过python自带函数bin()将十进制数转换成二进制数,生成的二进制数为str字符串格式,且会自动带上’0b’二进制标识符。

a2 = '01011110'
a10 = int(a2, 2)
a2_ = bin(a10)
print(a10)
print(a2_)
运行结果:
94
0b1011110

2 十六进制与十进制相互转换

通过python自带int()函数将十六进制转换成十进制数,十六进制数在python中一般也都是str字符串格式。

通过python自带函数hex()将十进制数转换成十六进制数,生成的十六进制数为str字符串格式,且会自动带上’0x’十六进制标识符。

a16 = '1c'
a10 = int(a16, 16)
a16_ = hex(a10)
print(a10)
print(a16_)
运行结果:
28
0x1c

3 二进制与十六进制的相互转换

二进制与十六进制直接的相互转换需要组合使用函数int()、bin()和hex()。

a16 = '1c'
a2 = bin(int(a16, 16))
print(a2)
运行结果:
0b11100

得到的二进制数是没有自动补零的。由于我们一般尝尝采用8个字节的二进制形式,且方便进行移位操作,我们需要高位补零。

4 高位补零

字符串函数zfill()用于给str字符串补零,用法如下

a = '11100'
b = a.zfill(8)  #补成8个字节
print(b)
运行结果:
00011100

但是,由于bin()函数自动生成的二进制数都会带上‘0b’标识符,直接采用zfill( )函数会在‘ob’的前面补零,这会导致该二进制数错误。我们采用如下办法先移除‘0b’,再进行补零操作。

a = '0b11100'
b = a[2:].zfill(8)  #去掉0b,取'11100',再补零
print(b)
运行结果:
00011100

5 二进制移位

因为在报文中经常会采用第一位的后几个字节与第二位的前几个字节组合表示一个数,所以需要用到移位操作。例如,如图所示的报文,行表示位数,列表示字节数,一位有八个字节。该报文中,绿色的信息表示横向距离,其由第2位的低位6个字节与第3位的高位4个字节组合得到。
在这里插入图片描述
假设现在第2位的数据为’0x1c’,将其转换为二进制为’00011100’,正好8个字节。假设第3位的数据为’0xa3’,将其转换为二进制为’10100011’。要求横向距离,首先将第2位的后6个字节取出来,并向左移4位。然后,将第3位的前4个字节取出来,并向右移位4位。于是有横向距离=‘0111000000’+‘1010’那么,横向距离即为’0111001010’ 。

a = '0x1c'
b = '0xa3'
a1 = int(bin(int(a, 16))[2:].zfill(8)[-6:], 2) << 4  #第2位的后6个字节
a2 = int(b, 16) >> 4  #第3位的前4个字节
c = a1 + a2
print(c)
d = '0111001010'
print(int(d, 2))
运行结果:
458
458

<<为python的向左移位操作符,>>为python的向右移位操作符。移位操作符的左边是int型十进制数,右边是要移动的字节数。该操作符将十进制数自动转换成二进制数,进行移位,移位后又自动将二进制数转换成十进制数返回。

猜你喜欢

转载自blog.csdn.net/qq_41690864/article/details/118313366