java读取文件 16进制_Java对文件的16进制读取和操作

这是一个Java程序,用于实现16进制文件的读取、修改和保存。程序通过Integer.parseInt和Integer.toHexString方法进行16进制与10进制的转换,并提供了一个16进制字符串替换的规则定义。它还具备文件备份和恢复功能,特别适用于游戏文件的16进制修改,例如双开和无限视距模式的开启。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家可以参考一下源代码的相关部分注释,然后写出自己的16进制处理程序。

有几个重点地方:

16进制字符串-》10进制数          int input = Integer.parseInt("Str", 16)

10进制整数-》16进制字符串          String hex = Integer.toHexString(int)

文件读取方法          作为2进制文件直接读取,一个byte为单位的读取。 将来我还将在此基础上制作Java版本的16进制编辑器,请大家多多支持。谢谢。 /**  * RO Utility  * Mainly used for:  * 1.Double Open client  * 2.Open Unlimited View  *  这是个样本程序,是我针对游戏修改写的。主要作用是将游戏文件用16进制打开,然后  * 修改相关的部分,然后保存。  *   * @author Ciro Deng(cdtdx@sohu.com)  * @version 1.0  */ package cn.edu.uestc.rotool; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringWriter; /**  * RO Utility Mainly used for: 1.Double Open client 2.Open Unlimited View  *   * @author Ciro Deng(cdtdx@sohu.com)  * @version 1.0  *   */ public class MainTool {     private final String RO_HOME = "D://Games//RO//"; //修改文件的路径     private final String FILE = "Ragexe"; //修改文件的主文件名     private final String BAK_FILE = FILE + "_BAK.sp2"; //修改文件的备份扩展名     private final String PATCH_FILE = FILE + ".sp2"; //修改文件的扩展名     /**      * 进行16进制替换的规则定义      * Pattern Array Example: pattern[0][0] = "Original Hex String"; 原16进制字符串      * pattern[0][1] = "New Hex String"; 要替换的16进制字符串      */     private final String[][] pattern = {             { "85C074095F5E33C05B8BE55DC3", "85C0EB095F5E33C05B8BE55DC3" },             { "85C0740E5F5EB801000000", "85C0EB0E5F5EB801000000" }, // Double             // Open             { "000066430000C843", "0000004300008644" } // Umlimited View     };     /**      * 备份文件恢复      * ture the backup file into real file      *       */     public void restore() {         if (isExistBackup()) {             new File(RO_HOME + PATCH_FILE).delete();             new File(RO_HOME + BAK_FILE)                     .renameTo(new File(RO_HOME + PATCH_FILE));             System.out.println("[----------------Restore file OK!--------------------]");         } else {             System.out.println("Backup file does not exist!");             System.exit(0);         }     }     public void init() { //初始化操作         if (new File(RO_HOME + PATCH_FILE).exists()) {             System.out                     .println("[-------------Initialize original file OK!-----------]");         } else {             System.out.println("File is not Existed! Please restore it first!");         }         // backup original file         if (!isExistBackup()) {             new File(RO_HOME + PATCH_FILE)                     .renameTo(new File(RO_HOME + BAK_FILE));         }         System.out                 .println("[---------------Please choose your action------------]");         System.out.println("1:Modify double open and unlimited view mode!");         System.out.println("2:Restore original mode!");         System.out.println("Please input 1 or 2 and Enter:");     }     public void success() { //成功操作提示         System.out.println();         System.out                 .println("[-------------Patch file OK! Have fun with RO!-------]");     }     /**      * 进行16进制替换      * replace input Hex String with defined pattern      *       * @param original      * @return      */     public String replace(String original) {         for (int i = 0; i < pattern.length; i++) {             original = original.replaceAll(pattern[i][0].toLowerCase(),                     pattern[i][1].toLowerCase());         }         return original;     }     /**      * 将文件读取为16进制String      * Read original File and transfer it into Hex String      *       * @return      * @throws IOException      */     public String readOriginal2Hex() throws IOException {         FileInputStream fin = new FileInputStream(new File(RO_HOME + BAK_FILE));         StringWriter sw = new StringWriter();         int len = 1;         byte[] temp = new byte[len];        /*16进制转化模块*/         for (; (fin.read(temp, 0, len)) != -1;) {             if (temp[0] > 0xf && temp[0] <= 0xff) {                  sw.write(Integer.toHexString(temp[0]));             } else if (temp[0] >= 0x0 && temp[0] <= 0xf) {//对于只有1位的16进制数前边补“0”                 sw.write("0" + Integer.toHexString(temp[0]));             } else { //对于int<0的位转化为16进制的特殊处理,因为Java没有Unsigned int,所以这个int可能为负数                 sw.write(Integer.toHexString(temp[0]).substring(6));             }         }         return sw.toString();     }     /**      * 将替换后的16进制字符串写回文件      * write replaced original String to file      *       * @param replaced      * @throws NumberFormatException      * @throws IOException      */     public void writeNew2Binary(String replaced) throws NumberFormatException,             IOException {         FileOutputStream fout = new FileOutputStream(RO_HOME + PATCH_FILE);         for (int i = 0; i < replaced.length(); i = i + 2) {             fout.write(Integer.parseInt(replaced.substring(i, i + 2), 16));         }     }     /**      * test direct output string to file      *       * @param temp      * @throws IOException      */     public void writeTest(String temp) throws IOException {         FileOutputStream fout = new FileOutputStream(RO_HOME + "test.txt");         for (int i = 0; i < temp.length(); i++) {             fout.write(temp.charAt(i));         }     }     /**      * check if the backup file exists      *       * @return      */     public boolean isExistBackup() {         return new File(RO_HOME + BAK_FILE).exists();     }     /**      * 主要操作方法,组织工作流程      * Main process method      *       * @throws IOException      */     public void patch() throws IOException {         // init         init();        //输入参数:        //1:进行查找替换        //2:将备份文件恢复         String input = new BufferedReader(new InputStreamReader(System.in))                 .readLine();         if (input.equals("1")) {             String temp = null;             temp = readOriginal2Hex();             temp = replace(temp);             writeNew2Binary(temp);             success();         } else if (input.equals("2")) {             restore();         } else {             System.out.println("Bad input parameter!");             System.exit(0);         }     }     /**      * Main方法      * main      *       * @param args      * @throws IOException      */     public static void main(String[] args) throws IOException {         MainTool tool = new MainTool();         tool.patch();     } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值