如果声明“无法正常工作”尽管条件属实

时间:2016-02-08 11:18:15

标签: python

当前正在浏览一个包含十六进制数据的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"有没有人对比赛为什么没有正常工作有任何想法?

2 个答案:

答案 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}}

他们是不同的。