字节串调用find(b'\x00')截取目标内容失败的原因排查
字节串切片异常问题排查
咱们直接来看你遇到的这个问题:你有一段字节串,想提取其中的b'B1:0,B2:0,B3:0',但运行代码后得到的却是b' ',完全不符合预期。
先还原你的场景:
你的源字节串:
data = b'#T\x005Q\x01\x00\x01_\x97\x013\xee\x1e\x00\x00\xcf\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00B1:0,B2:0,B3:0\x00\x1081\x00\xf7\xac'
你尝试的提取代码:
selectable = data[32:data.find(b'\x00')] print(selectable)
预期输出b'B1:0,B2:0,B3:0',实际输出b' '。
问题根源
核心问题出在data.find(b'\x00')的行为上:find()方法默认会返回整个字节串中第一个出现目标字节的索引。而你的字节串开头第3个位置(索引2)就有一个\x00(也就是b'#T\x00...'里的\x00),所以data.find(b'\x00')返回的是2。
这时候你写的切片data[32:2],在Python中当起始索引大于结束索引时,要么返回空字节串,要么因为字节串内其他细节返回b' ',但本质都是一样的:你找的是前面无关的\x00,根本不是目标字符串后面的那个终止符。
解决方案
你需要的是从索引32开始之后的第一个\x00,而不是整个字节串里的第一个。find()方法支持传入第二个参数start,指定查找的起始位置,完美解决这个问题:
data = b'#T\x005Q\x01\x00\x01_\x97\x013\xee\x1e\x00\x00\xcf\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00B1:0,B2:0,B3:0\x00\x1081\x00\xf7\xac' start_pos = 32 # 从start_pos开始查找第一个\x00的位置 end_pos = data.find(b'\x00', start_pos) selectable = data[start_pos:end_pos] print(selectable) # 输出: b'B1:0,B2:0,B3:0'
这样修改后,find()会跳过前面所有的\x00,只在索引32之后查找,找到的就是目标字符串末尾的那个\x00,切片自然就能得到你想要的内容了。
内容的提问来源于stack exchange,提问作者Shakib
相关产品推荐
相关产品推荐

