将Python 2中的字节与文件与hex literal进行比较?

时间:2014-08-20 21:30:25

标签: python byte

我正在尝试编写一个脚本来查看给定文件是否有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字面值?

2 个答案:

答案 0 :(得分:4)

尝试使用unpack的其他参数:

>>> header = "\xca\xfe\xba\xbe"
>>> struct.unpack(">L", header)
(3405691582,)
>>> struct.unpack(">L", header)[0] == 0xcafebabe
True

根据the docsL代表"无符号长" (即4个字节),>代表big-endian(这是这些字节的格式)。

答案 1 :(得分:1)

如何回合

self.data[:4].encode("hex") == "cafebabe"

self.data[:4] == "CAFEBABE".decode("hex")

(注意我认为它只有py2)