Java JPEG十六进制到ASCII

Java JPEG十六进制到ASCII,java,hex,notepad++,ascii,jpeg,Java,Hex,Notepad++,Ascii,Jpeg,我必须从数据库中读取JPEG图片。它们存储为十六进制字符串。 对于测试,我将原始十六进制字符串保存到一个文件中,用记事本++打开它,应用Convert->hex-->ASCII,并保存结果。这是有效的JPEG,可以在浏览器中渲染。 我曾尝试用java重现这一点 private String hexToASCII(String hex) { StringBuilder output = new StringBuilder(); for (int i = 0; i < hex.

我必须从数据库中读取JPEG图片。它们存储为十六进制字符串。 对于测试,我将原始十六进制字符串保存到一个文件中,用记事本++打开它,应用
Convert->hex-->ASCII
,并保存结果。这是有效的JPEG,可以在浏览器中渲染。 我曾尝试用java重现这一点

private String hexToASCII(String hex) {
    StringBuilder output = new StringBuilder();
    for (int i = 0; i < hex.length(); i+=2) {
        String str = hex.substring(i, i+2);
        output.append((char)Integer.parseInt(str, 16));
    }
    return output.toString();
}
如果您还尝试使用转换原始十六进制字符串 这将给出与我的代码相同的结果。生成的文件不是jpg。 记事本++在做什么?我如何在Java中重现它?
任何建议都将不胜感激。

您应该将字符串写入这样的文件中

    String s = hexToASCII(hex);
    Files.writeString(Paths.get("filename.jpg"), s, StandardCharsets.ISO_8859_1);

在Java中,将字符串写入文件时,根据字符集将字符编码为字节。字符集
ISO_8859_1
将一个字符直接编码为一个字节。

请勿将文件内容转换为ASCII、UTF-8、ISO-8859-1或其他字符编码!JPEG文件是二进制文件,不需要编码

我建议:

private void hexToBin(String hex, OutputStream stream) {
    for (int i = 0; i < hex.length(); i += 2) {
        String str = hex.substring(i, i + 2);
        stream.write(Integer.parseInt(str, 16));
    }
}

使用一个可以对文件进行二进制比较的工具,让您看到结果。您很可能已经交换了字节顺序。为什么它不是jpg<代码>ÿØ是字节
FF D8
的字符,这是jpg“图像开始”标题。它可能是JFIF吗?编辑:查看一下,了解更多信息,当您写入文件时,Java将从字符编码到字节。此时,您需要使用
ISO-8859-1
作为字符集。不要使用
UTF-8
。为什么它们存储为十六进制字符串?为什么不是一团?如果必须,为什么要使用Java代码?数据库肯定有解构功能吗?当然,您想要的不是十六进制到ASCII,而是十六进制到二进制?只需将字节按原样写入磁盘即可。在字符串之间来回转换为将来的维护人员提供了更微妙的bug。
private void hexToBin(String hex, OutputStream stream) {
    for (int i = 0; i < hex.length(); i += 2) {
        String str = hex.substring(i, i + 2);
        stream.write(Integer.parseInt(str, 16));
    }
}
private byte[] hexToBin(String hex) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream(hex.length() / 2);
    hexToBin(hex, stream);
    return stream.toByteArray();
}