加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

用java实现linux上exe文件的版本号读取功能

发布时间:2020-12-14 23:52:22 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 用java实现linux上exe文件的版本号读取功能。下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundExcepti

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

用java实现linux上exe文件的版本号读取功能。下面是详细代码:
    package com.herman.utils;  
      
    import java.io.File;  
    import java.io.FileNotFoundException;  
    import java.io.IOException;  
    import java.io.RandomAccessFile;  
    /** 
     * @see 获取文件信息的工具类 
     * @author Herman.Xiong 
     * @date 2014年5月12日 15:01:26 
     * @version V1.0 
     * @since tomcat 6.0,jdk 1.6 
     */  
    public class FileUtil {  
        /** 
         * @see 获取版本信息 
         * @param filePath 
         * @return 
         */  
        public static String getVersion(String filePath) {  
            File file = new File(filePath);  
            RandomAccessFile raf = null;  
            byte[] buffer;  
            String str;  
            try {  
                raf = new RandomAccessFile(file,"r");  
                buffer = new byte[64];  
                raf.read(buffer);  
                str = "" + (char) buffer[0] + (char) buffer[1];  
                if (!"MZ".equals(str)) {  
                    return null;  
                }  
      
                int peOffset = unpack(new byte[] { buffer[60],buffer[61],buffer[62],buffer[63] });  
                if (peOffset < 64) {  
                    return null;  
                }  
      
                raf.seek(peOffset);  
                buffer = new byte[24];  
                raf.read(buffer);  
                str = "" + (char) buffer[0] + (char) buffer[1];  
                if (!"PE".equals(str)) {  
                    return null;  
                }  
                int machine = unpack(new byte[] { buffer[4],buffer[5] });  
                if (machine != 332) {  
                    return null;  
                }  
      
                int noSections = unpack(new byte[] { buffer[6],buffer[7] });  
                int optHdrSize = unpack(new byte[] { buffer[20],buffer[21] });  
                raf.seek(raf.getFilePointer() + optHdrSize);  
                boolean resFound = false;  
                for (int i = 0; i < noSections; i++) {  
                    buffer = new byte[40];  
                    raf.read(buffer);  
                    str = "" + (char) buffer[0] + (char) buffer[1]  
                            + (char) buffer[2] + (char) buffer[3]  
                            + (char) buffer[4];  
                    if (".rsrc".equals(str)) {  
                        resFound = true;  
                        break;  
                    }  
                }  
                if (!resFound) {  
                    return null;  
                }  
      
                int infoVirt = unpack(new byte[] { buffer[12],buffer[13],buffer[14],buffer[15] });  
                int infoSize = unpack(new byte[] { buffer[16],buffer[17],buffer[18],buffer[19] });  
                int infoOff = unpack(new byte[] { buffer[20],buffer[21],buffer[22],buffer[23] });  
                raf.seek(infoOff);  
                buffer = new byte[infoSize];  
                raf.read(buffer);  
                int numDirs = unpack(new byte[] { buffer[14],buffer[15] });  
                boolean infoFound = false;  
                int subOff = 0;  
                for (int i = 0; i < numDirs; i++) {  
                    int type = unpack(new byte[] { buffer[i * 8 + 16],buffer[i * 8 + 17],buffer[i * 8 + 18],buffer[i * 8 + 19] });  
                    if (type == 16) { // FILEINFO resource  
                        infoFound = true;  
                        subOff = unpack(new byte[] { buffer[i * 8 + 20],buffer[i * 8 + 21],buffer[i * 8 + 22],buffer[i * 8 + 23] });  
                        break;  
                    }  
                }  
                if (!infoFound) {  
                    return null;  
                }  
      
                subOff = subOff & 0x7fffffff;  
                infoOff = unpack(new byte[] { buffer[subOff + 20],buffer[subOff + 21],buffer[subOff + 22],buffer[subOff + 23] }); // offset of first FILEINFO  
                infoOff = infoOff & 0x7fffffff;  
                infoOff = unpack(new byte[] { buffer[infoOff + 20],buffer[infoOff + 21],buffer[infoOff + 22],buffer[infoOff + 23] }); // offset to data  
                int dataOff = unpack(new byte[] { buffer[infoOff],buffer[infoOff + 1],buffer[infoOff + 2],buffer[infoOff + 3] });  
                dataOff = dataOff - infoVirt;  
      
                int version1 = unpack(new byte[] { buffer[dataOff + 48],buffer[dataOff + 48 + 1] });  
                int version2 = unpack(new byte[] { buffer[dataOff + 48 + 2],buffer[dataOff + 48 + 3] });  
                int version3 = unpack(new byte[] { buffer[dataOff + 48 + 4],buffer[dataOff + 48 + 5] });  
                int version4 = unpack(new byte[] { buffer[dataOff + 48 + 6],buffer[dataOff + 48 + 7] });  
                System.out.println(version2 + "." + version1 + "." + version4 + "."  
                        + version3);  
                return version2 + "." + version1 + "." + version4 + "." + version3;  
            } catch (FileNotFoundException e) {  
                return null;  
            } catch (IOException e) {  
                return null;  
            } finally {  
                if (raf != null) {  
                    try {  
                        raf.close();  
                    } catch (IOException e) {  
                    }  
                }  
            }  
        }  
      
        public static int unpack(byte[] b) {  
            int num = 0;  
            for (int i = 0; i < b.length; i++) {  
                num = 256 * num + (b[b.length - 1 - i] & 0xff);  
            }  
            return num;  
        }  
    }  

运行效果图(window上和linux的filePath自己改正正确即可):



转自:http://blog.csdn.net/xmtblog/article/details/25620685

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读