通过十六进制转换器读取NASM生成的Bin文件遇问题
解决NASM生成Bin文件后Java读取转十六进制的问题
嘿,我之前做自己的迷你汇编器项目时,也踩过类似的二进制文件读取的坑,咱们一步步来排查解决哈!
首先,咱们得把问题拆解成两步:确认NASM生成的Bin文件本身没问题,再排查Java读取转换的逻辑。
第一步:验证NASM生成的Bin文件是否正确
先别着急看Java代码,先确认NASM输出的二进制内容是对的。你可以在Ubuntu终端里用xxd test命令(因为NASM默认生成的文件名叫test,没有后缀)查看十六进制内容,正常情况下,你的汇编代码:
mov ax, 48
mov bx, 48
add ax, bx
对应的机器码应该是:B8 30 00 BB 30 00 01 D8(十六进制),所以xxd的输出应该是这样的:
00000000: b830 00bb 3000 01d8 .0..0...
如果输出和这个不一致,那得先检查NASM的命令或者你的汇编代码(不过你这段代码很简单,大概率没问题)。
第二步:排查Java读取转换的问题
最容易踩的坑就是用字符流读取二进制文件——Java的FileReader、BufferedReader这类是用来读文本的,会把字节按照系统默认编码(比如UTF-8)解析成字符,而二进制文件不是文本,这样肯定会导致数据丢失或错误转换。
正确的做法:用字节流读取
你需要直接读取文件的字节数组,再把字节数组转换成十六进制字符串。给你两个简单的示例代码:
示例1:用FileInputStream读取
import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class BinToHex { public static void main(String[] args) { File binFile = new File("test"); // 要和NASM生成的文件路径一致 try (FileInputStream fis = new FileInputStream(binFile)) { byte[] bytes = new byte[(int) binFile.length()]; fis.read(bytes); // 把字节数组转成格式化的十六进制字符串 StringBuilder hexBuilder = new StringBuilder(); for (byte b : bytes) { // %02X表示两位大写十六进制,小写用%02x hexBuilder.append(String.format("%02X ", b)); } System.out.println("转换后的十六进制:" + hexBuilder.toString().trim()); } catch (IOException e) { e.printStackTrace(); } } }
示例2:用NIO的Files.readAllBytes简化读取
import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; public class BinToHex { public static void main(String[] args) { try { // 直接读取整个文件的字节数组 byte[] bytes = Files.readAllBytes(Paths.get("test")); StringBuilder hexBuilder = new StringBuilder(); for (byte b : bytes) { hexBuilder.append(String.format("%02X", b)); } System.out.println("转换后的十六进制字符串:" + hexBuilder.toString()); } catch (IOException e) { e.printStackTrace(); } } }
其他可能的小问题
- 路径问题:运行Java程序时的工作目录要和NASM生成的
test文件在同一个目录,不然得写完整路径(比如/home/yourusername/test)。 - 权限问题:如果
test文件是用root权限生成的,普通用户运行Java可能读不了,用chmod 644 test调整一下权限就行。
按照这个步骤来,应该就能解决你读取时的问题啦!
内容的提问来源于stack exchange,提问作者Eagterrian Knight
相关产品推荐
相关产品推荐

