美文网首页
获取及修改文件头的前两个字节--Java实现

获取及修改文件头的前两个字节--Java实现

作者: cherishpf | 来源:发表于2020-07-15 16:18 被阅读0次
package cn.myjava.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.FileInputStream;
import java.io.RandomAccessFile;

/**
 * @author YPF
 */
@Slf4j
public class FileInfoUtil {
    /**
     * 修改文件头的前两个字节
     * @param header
     * @param filePath
     * @throws Exception
     */
    public static void modifyFileHeader(byte[] header, String filePath) {
        if (header.length == 2) {
            try (RandomAccessFile src = new RandomAccessFile(filePath, "rw")) {
                int srcLength = (int)src.length();
                // 略过前两个字节
                src.skipBytes(2);
                byte[] buff = new byte[srcLength - 2];
                // 读取除前两个字节之后的字节
                src.read(buff);
                src.seek(0);
                src.write(header);
                src.seek(header.length);
                src.write(buff);
            } catch (Exception e) {
                log.error("修改文件{}的前两个字节失败!", filePath);
            }
        }
    }

    /**
     * 根据文件路径获取文件头前两个字节
     *
     * @param filePath 文件路径
     * @return 文件头前两个字节信息
     */
    public static String getFileHeader(String filePath) {
        String value = null;
        try (FileInputStream is = new FileInputStream(filePath)) {
            byte[] b = new byte[2];
            is.read(b, 0, b.length);
            value = bytesToHexString(b);
        } catch (Exception e) {
            log.error("获取文件{}的前两个字节失败!", filePath);
        }
        return value;
    }

    /**
     * 将byte数组转换成string类型表示
     * @param src
     * @return
     */
    private static String bytesToHexString(byte[] src) {
        StringBuilder builder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        String hv;
        for (int i = 0; i < src.length; i++) {
            // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
            hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
            if (hv.length() < 2) {
                builder.append(0);
            }
            builder.append(hv);
        }

        return builder.toString();
    }

    /**
     * 将Hex String转换为Byte数组
     *
     * @param hexString the hex string
     * @return the byte [ ]
     */
    public static byte[] hexStringToBytes(String hexString) {
        if (StringUtils.isEmpty(hexString)) {
            return null;
        }
        hexString = hexString.toLowerCase();
        final byte[] byteArray = new byte[hexString.length() >> 1];
        int index = 0;
        for (int i = 0; i < hexString.length(); i++) {
            if (index  > hexString.length() - 1) {
                return byteArray;
            }
            byte highDit = (byte) (Character.digit(hexString.charAt(index), 16) & 0xFF);
            byte lowDit = (byte) (Character.digit(hexString.charAt(index + 1), 16) & 0xFF);
            byteArray[i] = (byte) (highDit << 4 | lowDit);
            index += 2;
        }
        return byteArray;
    }
}

相关文章

  • 获取及修改文件头的前两个字节--Java实现

  • 四、Java探针技术

    对于agent,是在vm启动,执行方法前,将字节码修改的服务代理。 对于javassist,是修改字节码具体实现。...

  • 反射

    1.原理 java反射是java中获取内存中字节码对象,然后获取对象的属性,方法对对像进行修改的一种技术。框架的核...

  • spring aop源码实现分析

    AOP就是面向切面编程,我们可以从几个层面来实现AOP。 在编译器修改源代码,在运行期字节码加载前修改字节码或字节...

  • 程序员练级攻略(2018):Java底层知识

    Java 字节码相关 首先,Java 最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成 Java 字节码。...

  • ASM框架学习(一)-基本概念

    简介 ASM是java字节码操作框架,利用该框架可以达到动态修改java运行对象代码的目的,也可以实现动态代理等功...

  • Kotlin中的反射

    博客地址https://sguotao.top Java中的反射机制,使得我们可以在运行期获取Java类的字节码文...

  • Concurrent

    JDK1.5前,JAVA使用synchronized实现对共享变量的同步,synchronized在字节码上加指令...

  • Centos7编译及升级openssh

    编包及升级 安装rpmbuild及依赖包 创建编包目录 获取openssh源码包 获取spec文件,同时修改两个配...

  • Java字节码修改 - javassist

    AOP的实现一般使用了动态代理和字节码修改,本文介绍使用javassist实现类的创建和修改 添加依赖 使用字节码...

网友评论

      本文标题:获取及修改文件头的前两个字节--Java实现

      本文链接:https://www.haomeiwen.com/subject/nehjhktx.html