我正在尝试编写一个脚本来查看给定文件是否有Java类文件头,即文件的前4个字节是0xCAFEBABE。
但是我不太确定如何进行相等检查。
这是我当前的暂存代码:
class JavaClassParser(object):
def __init__(self, filename):
self.filename = filename
if not os.path.isfile(self.filename):
print "Please supply a valid source path"
sys.exit(1)
with open(self.filename, 'rb') as f:
self.data = f.read()
self.verify_header()
def verify_header(self):
""" Verifies 0xCAFEBABE header present
(Java class file header) """
header = struct.unpack("cccc", self.data[:4])
if header != 0xCAFEBABE:
print "File", self.filename, "does not appear to be a valid" +\
" Java classfile. Header was", repr(header), "expected", repr(0xCAFEBABE)
sys.exit(1)
当我向它提供有效的Java类文件时,我会收到:
File myclass.class does not appear to be a valid Java classfile. Header was ('\xca', '\xfe', '\xba', '\xbe') expected 3405691582
所以0xCAFEBABE
被Python解释为一个int - 我觉得我对这里的某些东西有一个严重的误解。
我可以将0xCAFEBABE
重写为"\xca\xfe\xba\xbe"
并删除pack
调用,但我发现该语法很难看。有没有办法让我使用0xCAFEBABE
字面值?
答案 0 :(得分:4)
尝试使用unpack
的其他参数:
>>> header = "\xca\xfe\xba\xbe"
>>> struct.unpack(">L", header)
(3405691582,)
>>> struct.unpack(">L", header)[0] == 0xcafebabe
True
根据the docs,L
代表"无符号长" (即4个字节),>
代表big-endian(这是这些字节的格式)。
答案 1 :(得分:1)
如何回合
self.data[:4].encode("hex") == "cafebabe"
或
self.data[:4] == "CAFEBABE".decode("hex")
(注意我认为它只有py2)