代码之家  ›  专栏  ›  技术社区  ›  Usman

如何确定给定的文件是类文件?

  •  0
  • Usman  · 技术社区  · 14 年前

    我需要确定给定的文件是否是类文件。假设我将扩展名更改为.exe/.xml或其他文件,我需要确定给定的文件、类文件的解析方式是否不同,以及类文件的解析方式是否不同。

    如何读取类文件格式?

    3 回复  |  直到 12 年前
        1
  •  4
  •   Jon Skeet    14 年前

    我怀疑 BCEL 让你这么做。现在检查…

    编辑:是的。你可以使用 ClassParser 班级; parse 方法将引发 ClassFormatException 如果文件不是真正的Java类文件。

    编辑:好的,所以你需要从C处知道。三种选择:

    • 检查报头是否为0xcafebabe,并保留它(这将是一个很好的启发式方法)
    • 端口BCEL到C(显然只是您需要的位)
    • 尝试使用j*来直接编译BCEL到.NET,如果它不使用Java 1.1.4以外的任何东西,那么只工作,但是你 可以 找到一个真正的老版本的BCEL在这方面工作得很好。当然,你也需要得到J的支持,现在J已经停产了。

    咖啡馆测试非常简单:

    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
  •  9
  •   OscarRyz    14 年前

    类文件从十六进制开始: 0xCAFE 0xBABE 这是个好的开始:

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

        3
  •  2
  •   Dean Harding    14 年前

    这个 class file format 表示类文件的前四个字节将是 CA FE BA BE ,所以你可以检查一下。根据您的需求,这可能是一个足够简单的检查。

    作为另一种(可能更好)解决方案,只需尝试加载文件。如果失败,那么它就不是类文件。如果成功了,那就是成功了。