繁体   English   中英

比较文件中具有十六进制文字的Python 2中的字节?

[英]Compare bytes in Python 2 from file with hex literal?

我正在尝试编写脚本以查看给定文件是否具有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文字吗?

尝试使用其他参数unpack

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

根据文档L代表“无符号长”(即4个字节), >代表big-endian(这是这些字节的格式)。

怎么样

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

要么

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

(请注意,我认为它只有py2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM