You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过十六进制转换器读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:06:54