当前正在浏览一个包含十六进制数据的bin文件进行处理,但是目前我用来尝试在文件中找到一组3个十六进制字节的匹配项无法正常工作。这些值是相同的,但它不打印我的字符串我目前已设置确认它是匹配,目前我试图匹配前3个字节,所以我们知道它的工作原理等代码如下:
match1 = "\\x00\\n\\x00"
print ("match1 ="+match1)
if byteData == match1:
print ("Byte string 030791 found!")
elif byteData == match1:
print ("Byte string 050791 found!")
exit()
byteData的值当前是' \ x00 \ n \ x00'但是脚本忽略了这个并且只是移动到exit语句。该文件正在按如下方式打开:
file = open('file.bin', 'rb')
while True:
byte = file.read(3)
当打印字节值时,它报告为" \ x00 \ n \ x00"有没有人对比赛为什么没有正常工作有任何想法?
答案 0 :(得分:3)
match1
不包含3个字节。它包含10:
>>> match1 = "\\x00\\n\\x00"
>>> len(match1)
10
您转义了转义序列,因此\\x00
四个字节,\
反斜杠,然后是x
后跟两个0
位数。
删除反斜杠转义符:
match1 = "\x00\n\x00"
不要试图直接打印;终端通常不会使空值可见,所以你只需要一个额外的换行符。使用repr()
function生成看起来就像Python字符串的调试输出,这样您就可以在代码或交互式解释器中重现该值:
print ("match1 =", repr(match1))
这也是交互式解释器向您显示表达式结果的方式(除非它们生成None
):
>>> match1 = "\x00\n\x00"
>>> len(match1)
3
>>> match1
'\x00\n\x00'
>>> print("match1 =", repr(match1))
match1 = '\x00\n\x00'
接下来,如果您使用的是Python 3,那么您仍然无法匹配,因为您以二进制模式打开了文件,因此获得bytes
objects,但您的match1
变量是str
text sequence。如果你想要两种类型匹配你要么必须转换(编码文本或解码字节),要么match1
bytes
对象开始:
match1 = b'\x00\n\x00'
b
前缀使其成为bytes
字面值。
答案 1 :(得分:0)
查找
{{1}}
他们是不同的。