[英]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.