读取二进制文件并在python中使用匹配字符进行检查

读取二进制文件并在python中使用匹配字符进行检查,python,binary,byte,bit-shift,nmea,Python,Binary,Byte,Bit Shift,Nmea,我想从GPS接收器字节扫描数据文件(实际上这将是一个连续的流程,不想用脱机数据测试代码)。如果找到匹配项,则检查下2个字节的“长度”,然后获取下2个字节并向右移动2位(不是字节),等等。我以前没有处理二进制,因此陷入了一个简单的任务。我可以逐字节读取二进制文件,但找不到按所需模式匹配的方法(即D3) 输出文件为: b'\x82' b'\xc2' b'\xe3' b'\xb8' b'\xe0' b'\x00' b'@' b'\x13' b'\x05' b'!' b'\xd3' b'\x00' b'

我想从GPS接收器字节扫描数据文件(实际上这将是一个连续的流程,不想用脱机数据测试代码)。如果找到匹配项,则检查下2个字节的“长度”,然后获取下2个字节并向右移动2位(不是字节),等等。我以前没有处理二进制,因此陷入了一个简单的任务。我可以逐字节读取二进制文件,但找不到按所需模式匹配的方法(即D3)

输出文件为:

b'\x82'
b'\xc2'
b'\xe3'
b'\xb8'
b'\xe0'
b'\x00'
b'@'
b'\x13'
b'\x05'
b'!'
b'\xd3'
b'\x00'
b'\x13'
。。。。 如何检查该字节是否为=='\xd3'?(D3) 还想知道如何按位移位,因为我需要检查由6位组成的十进制值 (1字节和下一个字节的前2位)。考虑到,取2字节(8位),然后2位右移 获取6位。在python中可能吗?非常感谢您的任何改进/添加/更改

还有,我能把前面那个讨厌的b去掉吗?但如果忽略它不会影响,那么就没有问题了


提前谢谢

“该字节”前面用一个b“”表示,表示它是一个字节对象。要删除它,可以将其转换为int:

thatbyte = b'\xd3'
byteint = thatbyte[0]  # or
int.from_bytes(thatbyte, 'big')  # 'big' or 'little' endian, which results in the same when converting a single byte
要进行比较,您可以执行以下操作:

thatbyte == b'\xd3'
因此,将一个字节对象与另一个字节对象进行比较。
换班谢谢。但是为什么这个不起作用呢?在文件中找不到“\xd3”。检查打开时的_D3=b'\xd3'(“COM6_200417.ubx”,“rb”)作为f:byte=f.read(1)#每次读取1个字节,而byte!=b'':#用字节做东西。byte=f.read(1)如果byte==check_D3:print('Found D3:')否则:退出()
else:exit()
立即退出程序。因此,如果第一个字节不匹配,程序已经退出。哦,是的。谢谢现在可以了。关于您关于读取整个文件的建议,这里我使用一个固定大小的二进制文件进行测试,但对于实际使用,GPS接收器将每秒连续发送数据。因此,我必须连续扫描,如果我找到一个“D3”,然后检查下一个字节的数据长度,然后再检查另一个6位,如果它们是两个特定的数字或不是。如果是,则发送该数据块(如前面从数据长度中找到的,可能会有所不同)以进行传输。如果没有“D3”或未找到该编号,则丢弃该编号并等待下一次馈送。它将继续。很高兴它能起作用。当文件不断更新时,不立即读取整个文件是正确的。
thatbyte == b'\xd3'
bytes([byteint])   # note the extra brackets!
with open("COM6_200417.ubx", "rb") as f:
    allbytes = f.read() # read all
    for val in allbytes:
        # Do stuff with val, val is int !!!
        print(bytes([val]))