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

摘要:
您可以参考源代码的相关注释,然后编写自己的十六进制处理程序。未来,我将在此基础上制作一个Java版本的十六进制编辑器。请支持。主要功能是以十六进制打开游戏文件,*修改相关部分,然后保存**@authorCiroDeng*@version1.0*/packagecn.edu.uestc。旋转工具;导入java.io。缓冲读取器;导入java.io。文件导入java.io。文件输入流;导入java.io。文件输出流;导入java.io。IO异常;导入java.io。输入流阅读器;导入java.io。StringWriter;/***ROUtility主要用于:1.DoubleOpenclient2。OpenUnlimitedView**@authorCiroDeng*@version1.0**/publicclassMainTool{privatefinalStringRO_HOME=“D://Names//RO//”;//修改文件privatefinitlStringFILE=“Ragexe”的路径;//修改privateffinalStringBAK_file=file+“_BAK.sp2”的主文件名;//修改Privatefinal StringPATCH_file=file LE+“.sp2 ;// 修改文件扩展名/***十六进制替换的规则定义*PatternArray示例:pattern[0][0]=“OriginalHexString”;原始十六进制字符串*模式[0][1]=“NewHexString”;要替换*/privatefinalString[][]模式的十六进制字符串={{“85C074095F5E33C05B8BE55DC3”、“85C0EB095F5 E33C005B8BE550DC3”}、{“85 C0740E5F5EB801000000”、“85 C0EB0E5F 5EB80000000”},//双击/打开{“0000664300C843”,“00000043008644”}//UmlimitedView}/***将备份文件*toothebackupfile还原为realfile**/publicvoidrestore(){if{newFile.delete();newFile.renameTo;System.out.println(“[------------------RestorefileOK!”);系统输出。println;}Publicvoid success(){//成功的操作提示System.out.println();System.out.println(“[-------------PatchfileOK!
大家可以参考一下源代码的相关部分注释,然后写出自己的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();
}
}
来源:<http://blog.csdn.net/cdtdx/article/details/1529804>

来自为知笔记(Wiz)

免责声明:文章转载自《Java对文件的16进制读取和操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇15.ThinkPHP 中间件【sql server镜像】SQL SERVER 基于数据库镜像的主从同步(数据库镜像实践汇总)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

限制IP注册到Eureka

平时总有人无意中把自己本地的服务注册到开发、测试环境的注册中心,导致服务器不可用的问题,通过下面的方法禁止不被允许的IP注册到Eureka importjava.util.List; importcom.netflix.eureka.lease.Lease; importorg.slf4j.Logger; importorg.slf4j.LoggerFa...

java实时监听日志写入kafka

目的 实时监听某目录下的日志文件,如有新文件切换到新文件,并同步写入kafka,同时记录日志文件的行位置,以应对进程异常退出,能从上次的文件位置开始读取(考虑到效率,这里是每100条记一次,可调整)   源码: [java] view plain copy  import java.io.BufferedReader;   import ja...

Java中通过脚本引擎调用js函数

1 import java.io.*; 2 importjavax.script.Invocable; 3 importjavax.script.ScriptEngine; 4 importjavax.script.ScriptEngineManager; 5 importjavax.script.ScriptException; 6 importorg....

如何列出multimap中某個key的所有value? (C/C++) (STL)

map和multimap都自帶find(),不需Generic Algorithm就可搜尋,事實上,當container和algorithm都提供方法時,應先考慮使用container自帶的方法,因為algorithm考慮到泛型,還需要經過iterator,但container自帶的方法卻是量身訂做的,所以執行速度較快。要列出multimap中某個key的...

【C#写日志两个简单方法】

方法一:以日期为日志文件名. public void WriteLog(stringmsg) { string filePath = AppDomain.CurrentDomain.BaseDirectory + "Log"; if (!Directory.Exists(filePath)) {...

ant Form 常用 api

经过 Form.create 包装的组件将会自带 this.props.form 属性,this.props.form 提供的 API 如下: 注意:使用 getFieldsValue getFieldValue setFieldsValue 等时,应确保对应的 field 已经用 getFieldDecorator 注册过了。 方法      说明...