【发布时间】: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