校验class文件的魔数,前四个字节

在class文件开头的四个字节, 存放着class文件的魔数, 这个魔数是class文件的标志,他是一个固定的值: 0XCAFEBABE 。 也就是说他是判断一个文件是不是class格式的文件的标准, 如果开头四个字节不是0XCAFEBABE, 那么就说明它不是class文件, 不能被JVM识别。

校验一下啦:

package java2.os;

import com.google.common.collect.FluentIterable;
import com.google.common.io.Files;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * Created by fhqplzj on 16-10-25 at 下午8:11.
 */
public class ByteInt {
    /**
     * int to byteArray
     *
     * @param value
     * @return
     */
    public static byte[] toByteArray(int value) {
        return new byte[]{
                (byte) (value >> 24),
                (byte) (value >> 16),
                (byte) (value >> 8),
                (byte) value
        };
    }

    /**
     * byteArray to int
     *
     * @param b1
     * @param b2
     * @param b3
     * @param b4
     * @return
     */
    public static int fromBytes(byte b1, byte b2, byte b3, byte b4) {
        return b1 << 24 | (b2 & 0xff) << 16 | (b3 & 0xff) << 8 | (b4 & 0xff);
    }

    /**
     * bytes数组大小至少为4
     *
     * @param bytes
     * @return
     */
    public static int fromByteArray(byte[] bytes) {
        assert bytes.length >= Integer.BYTES;
        return fromBytes(bytes[0], bytes[1], bytes[2], bytes[3]);
    }

    public static void main(String[] args) {
        String path = "/home/fhqplzj/IdeaProjects/DocumentClustering";
        File root = new File(path);
        FluentIterable<File> files = Files.fileTreeTraverser().breadthFirstTraversal(root);
        for (File file : files) {
            if (file.isFile() && file.getName().endsWith(".class")) {
                byte[] header = new byte[4];
                try (FileInputStream inputStream = new FileInputStream(file)) {
                    inputStream.read(header, 0, header.length);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                String s = Integer.toHexString(fromByteArray(header)).toUpperCase();
                System.out.println(String.format("%-100s%s", file.getName(), s));
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值