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

如何用Java实现Notepad++的HEX转ASCII生成有效JPEG?

问题分析与解决方案

你遇到的核心问题是用字符串(String)中转二进制数据导致的编码损坏,Notepad++的Hex转ASCII本质是直接写入二进制字节,而你的Java代码错误地通过字符编码层处理了二进制数据,最终导致JPG文件损坏。

为什么Notepad++转换有效?

Notepad++的「Convert -> HEX -> ASCII」功能其实名不副实——它并不是真的把十六进制转成ASCII文本,而是直接将每两位十六进制对应的字节写入文件。比如十六进制的FF会被直接写成字节0xFF,完全保留原始二进制数据,没有经过任何字符编码转换,所以生成的JPG是有效的。

你的Java代码哪里错了?

你的hexToASCII方法把每个十六进制对转成char,再拼接成String,然后保存文件。这里的问题在于:

  • String是用来存储文本数据的,它基于Unicode编码,而JPG是二进制文件,包含很多无法被Unicode(或默认编码如UTF-8)正确表示的字节。
  • 当你把String写入文件时,Java会使用默认字符编码(比如UTF-8)将Unicode字符转成字节。例如,原始字节0xFF会被转成UTF-8的替代字符�对应的字节0xEF 0xBF 0xBD,这直接破坏了JPG的文件头和数据结构,导致文件无效。

正确的Java实现方式

要复现Notepad++的逻辑,你需要直接操作字节数组,跳过字符串中转,把十六进制直接转成字节后写入文件:

import java.io.FileOutputStream;
import java.io.IOException;

public class HexToJpegConverter {
    // 将十六进制字符串转为字节数组
    public static byte[] hexStringToByteArray(String hex) {
        int length = hex.length();
        byte[] byteArray = new byte[length / 2];
        
        for (int i = 0; i < length; i += 2) {
            // 每两位十六进制转为一个字节
            byteArray[i / 2] = (byte) Integer.parseInt(hex.substring(i, i + 2), 16);
        }
        return byteArray;
    }

    public static void main(String[] args) {
        String hexImageData = "你的十六进制字符串"; // 替换为实际的JPG十六进制数据
        byte[] imageBytes = hexStringToByteArray(hexImageData);
        
        // 将字节数组写入文件
        try (FileOutputStream outputStream = new FileOutputStream("output.jpg")) {
            outputStream.write(imageBytes);
            System.out.println("JPG文件生成成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键说明

  • 这个方法直接将十六进制字符串转换为字节数组,完全保留原始二进制数据,和Notepad++的处理逻辑一致。
  • 处理图片、视频、音频这类二进制文件时,永远不要用String作为中间载体,必须直接操作字节流或字节数组,避免编码转换带来的数据损坏。

内容的提问来源于stack exchange,提问作者Hans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:07:58