我正在尝试从涉及字节码的用户解决一个有趣的问题。我想确定与这些文件关联的幻数,以查看它们是否使用不同的版本进行编译。不幸的是,我们使用的是Jython,它似乎没有imp.get_magic()
。有没有人知道另一种确定幻数的方法?我开始在文本编辑器中查看文件,以检查this answer的“第一个单词”。但我不知道在“斜线”和“数字”中,“第一个字”的结尾。有谁知道如何通过查看实际字节码来解决这个问题?或者有谁知道Jython对字节码的处理与Python有何不同?我的印象是它以相同的方式完成(除了编写* $ py.class文件而不是* .pyc文件),但现在我不太确定。
编辑:
首先,我决定尝试在文本编辑器中读取二进制文件只是愚蠢。我创建了一个模块并使用Python将其编译为*.pyc
,然后使用
with open('compiledModule.pyc', 'rb') as binaryFile:
magicNumber = binaryFile.read(4)
print magicNumber.encode('hex')
它与创建它的Python版本匹配了幻数(应该如此),如下所示:
print imp.get_magic().encode('hex')
当我用Jython编译相同的模块时,进入'* $ py.class'文件,然后用
读取它with open('compiledModule$py.class', 'rb') as otherFile:
cafeBabe = otherFile.read(4)
print cafeBabe.encode('hex')
确实它以cafebabe
的形式回来了。所以在这种情况下,我试图确定创建字节码的Jython版本,看来我不能。
答案 0 :(得分:3)
此上下文中的“单词”是固定长度(理论上是整数的大小)。 Python的幻数长度为四个字节。
我相信Jython编译为java字节码(然后由java VM运行),而不是python字节码。