读取二进制文件并检查 python 中的匹配字符

Read binary file and check with matching character in python

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

with open("COM6_200417.ubx", "rb") as f:
byte = f.read(1)  # read 1-byte at a time
while byte != b"":
    # Do stuff with byte.
    byte = f.read(1)
    print(byte) 

输出文件为:

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 有可能吗?非常感谢任何 improvement/addition/changes。

ps。我可以从前面摆脱那个讨厌的 'b' 吗?但是如果忽略它不影响那么没问题。

提前致谢。

'That byte'前面用一个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'

因此将一个字节对象与另一个字节对象进行比较。 shift << 运算符仅适用于 int

要将 int 转换回字节(假设它是 [0..255]),您可以使用:

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]))