如何使用Java API确定文件是32位还是64位?

时间:2013-01-21 15:02:52

标签: java

我有一个上传的文件(一个* .wim文件,可以是32位或64位-WAIK / WADK)。

将wim文件复制到某个位置。

之前我们只有32位支持,但现在为了UEFI目的,我们需要支持32位(对于BIOS)和64位(对于UEFI)。

现在,上传完成后,意图基于文件类型,我将其复制到32位或64位文件夹。

如何辨别它?

P.S:删除了win标签,因为这更像是文件类型而不是WIM的一般确定。

1 个答案:

答案 0 :(得分:2)

如果我们忽略WIM问题并且只考虑找到编译了exe文件(Portable Executable)的体系结构,这是相对简单的:

  • 文件必须以两个字节0x4d,0x5a开头,相当于字符串" MZ"的ASCII编码。
  • 在偏移量0x3c处,读取4个字节的小端编码,以获得到PE头的偏移量。
  • 在偏移" PE标头",您应该检查四个字节0​​x50,0x45,0x00,0x00,相当于字符串" PE \ 0 \ 0"的ASCII编码。
  • 紧跟PE标题后,您将找到一个20字节长的COFF文件头。机器类型在COFF标头的两个第一个字节中进行编码(小端)。

与您的情况相关的可能是机器类型0x014c(i386)和0x8664(AMD64)。

有关详细信息,您可以从Microsoft here获取PE规范。 2.3.1节中列出了不同的机器类型。

您可能还有兴趣检查COFF标头的特征字段(最后两个字节)以将文件标识为可执行文件(而不是例如DLL文件)。