【问题标题】:Java JPEG hex to ASCIIJava JPEG 十六进制转 ASCII
【发布时间】:2020-11-20 00:01:35
【问题描述】:

我必须从数据库中读取 JPEG 图片。它们存储为十六进制字符串。 对于测试,我已将原始十六进制字符串保存到文件中,用 Notepad++ 打开它并应用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 它以

开头
ÿØÿà JFIF      ÿÛ C             

如果还尝试将原始十六进制字符串转换为 https://www.rapidtables.com/convert/number/hex-to-ascii.html 这给出了与我的代码相同的结果。结果文件不是jpg。 Notepad++ 在做什么,如何在 Java 中重现它? 任何建议将不胜感激。

【问题讨论】:

  • 使用一个可以二进制比较文件的工具,让你看到结果。您很可能已经交换了字节顺序。
  • 为什么不是jpg? ÿØ 是字节FF D8 的字符,也就是jpg“Start Of Image”标头。
  • 会是 JFIF 吗? (有乱写的JFIF)编辑:查看更多信息en.wikipedia.org/wiki/JPEG_File_Interchange_Format
  • 当您写入文件时,Java 会从字符编码为字节。这时候需要使用ISO-8859-1作为字符集。不要使用UTF-8
  • 为什么将它们存储为十六进制字符串?为什么不是 BLOB?如果必须,为什么要使用 Java 代码?数据库肯定有去十六进制功能吗?当然你想要的不是十六进制到 ASCII,而是十六进制到二进制?

标签: java hex notepad++ ascii jpeg


【解决方案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));
    }
}

也许:

private byte[] hexToBin(String hex) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream(hex.length() / 2);
    hexToBin(hex, stream);
    return stream.toByteArray();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 2018-12-06
    • 2014-06-22
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2015-05-22
    相关资源
    最近更新 更多