求助:python如何按位解析二进制数据

Python09

求助:python如何按位解析二进制数据,第1张

可以的,二进制是计算机内的表示方法,处理二进制数据是最基本的能力。

如果是二进制字符串转十进制:

>>> x = '10101010'

>>> int(x, 2)

170

如果是从文件或网络中获取的数据,要知道某一位是0还是1的话,获取的数据可以按字符读取,由于一个字符由8位二进制表示,分别读取1到8位的二进制值就可以了:

>>> get_char_bit = lambda char, n: (char >> (8-n)) & 1 # 从高到低分别为第1~8位

>>> data = b'ab' # 在python3中字符串默认是unicode,所以加上b前缀兼容

>>> # 在python3中按字符读取byte字符串是数字,而python2读出来的却是字符,但bytearray是一致的都是数字

>>> data = bytearray(data)

>>> result = []

>>> for char in data:

        for i in range(1, 9):

            result.append(get_char_bit(char, i)) 

>>> result

[0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0]

还有一种比较简单的方法是使用内置的bin函数

>>> data = bytearray(b'ab')

>>> result = []

>>> for char in data:

        result.extend(bin(char)[2:].rjust(8, '0'))

        

>>> result

['0', '1', '1', '0', '0', '0', '0', '1', '0', '1', '1', '0', '0', '0', '1', '0']

&按位与|按位或^按位异或1.按位与运算按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下:00001001(9的二进制补码)&00000101(5的二进制补码)00000001(1的二进制补码)可见9&5=1。按位与运算通常用来对某些位清0或保留某些位。例如把a的高八位清0,保留低八位,可作a&255运算(255的二进制数为0000000011111111)。main(){inta=9,b=5,cc=a&bprintf("a=%d\nb=%d\nc=%d\n",a,b,c)}2.按位或运算按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。例如:9|5可写算式如下:00001001|0000010100001101(十进制为13)可见9|5=13main(){inta=9,b=5,cc=a|bprintf("a=%d\nb=%d\nc=%d\n",a,b,c)}3.按位异或运算按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:00001001^0000010100001100(十进制为12)main(){inta=9a=a^15printf("a=%d\n",a)}