如何确定给定文件是一个类文件?

时间:2010-07-14 06:49:51

标签: c# java

我需要确定给定文件是否是类文件。假设我将扩展名更改为.exe / .xml或其他一些,我需要确定是否给定文件,如果一个类文件将被不同地解析,如果它将是另一个,它将以这种方式解析。 / p>

如何阅读班级档案格式?

3 个答案:

答案 0 :(得分:9)

Java .class文件以HEX开头:0xCAFE 0xBABE这是一个好的开始:

CAFE BABE http://a.imageshack.us/img820/2908/capturadepantalla201007k.png

答案 1 :(得分:4)

我怀疑BCEL允许你这样做。现在检查......

编辑:是的,确实如此。你可以使用ClassParser类;如果文件实际上不是Java类文件,parse方法将抛出ClassFormatException

编辑:好的,所以你需要知道C#。三个选项:

  • 检查标题是否为0xcafebabe并留在那(它将是一个非常好的启发式)
  • 将BCEL端口转换为C#(显然只需要你需要的位)
  • 尝试使用J#直接将BCEL编译为.NET - 只有在不使用Java 1.1.4以外的任何内容时才会起作用,但可能找到一个真正旧版本的BCEL可以正常工作在这方面。当然,你也需要掌握J#,现在已停止使用。

CAFEBABE测试非常简单:

public bool IsProbablyJava(string file)
{
    using (Stream stream = File.OpenRead(file))
    {
        return stream.ReadByte() == 0xca &&
               stream.ReadByte() == 0xfe &&
               stream.ReadByte() == 0xba &&
               stream.ReadByte() == 0xbe;
    }
}

它并不完全......还有BinaryReader等替代品。

答案 2 :(得分:2)

class file format表示类文件的前四个字节为CA FE BA BE,因此您可以检查它。根据您的要求,这可能是一个足够简单的检查。

作为替代(可能更好)的解决方案,只需尝试加载文件即可。如果失败,则它不是类文件。如果成功,那就是。