如何将十六进制字节数组转为字符串?及.java转该数组方法
问题解答
1. 将unsigned char数组转为可读内容
这个数组是Java类的字节码二进制数据,直接转普通字符串会出现乱码,正确处理方式是还原为.class文件再反编译:
- 用C/C++或其他语言写简单程序,把数组中的字节写入后缀为
.class的文件(比如ClassLoader.class) - 用JD-GUI、Procyon这类反编译工具打开该.class文件,就能看到可读的Java代码
- 若只想查看字节码结构,可使用JDK自带的
javap命令:生成.class文件后执行javap -c -v ClassLoader.class,即可查看字节码指令与结构细节
2. 0x00、0xCA这类十六进制值的含义
这些是Java字节码的标准组成单元:
0xCA, 0xFE, 0xBA, 0xBE:Java字节码的魔数,所有合法.class文件的开头都是这四个字节,用来标识文件类型为Java类文件0x00, 0x00:紧随魔数的次版本号,值为0代表无次版本区分0x00, 0x34:主版本号,0x34对应十进制52,代表该类文件由JDK 8编译生成(版本对应关系:JDK8→52、JDK7→51、JDK6→50,以此类推)- 后续其他十六进制值对应类的具体结构数据,包括常量池、类信息、方法指令、属性定义等,每个字节或字节组合都对应Java字节码规范中的特定指令或数据结构
3. 修改Java代码后转回unsigned char数组
按以下步骤操作即可:
- 编译修改后的Java文件:用JDK自带的
javac命令编译源文件,生成对应.class文件,比如执行javac YourModifiedClass.java - 读取.class文件二进制内容:用Python、C/C++等语言读取.class文件的每一个字节,转换为十六进制格式(如
0xXX) - 生成目标数组:将所有十六进制字节按格式整理成
unsigned char[]形式,每个字节用0xXX,分隔
举个Python示例(快速生成数组内容):
with open("YourModifiedClass.class", "rb") as f: bytes_data = f.read() # 拼接成目标数组字符串 array_content = "unsigned char classLoaderClass[] = {\n " array_content += ", ".join([f"0x{b:02X}" for b in bytes_data]) array_content += " };" # 打印或写入文件 print(array_content)
内容的提问来源于stack exchange,提问作者16audiopunks_
相关产品推荐
相关产品推荐

