java - 如何在java中正确验证PNG头?
问题描述
我正在尝试编写一个函数来检查 PNG 文件是否未损坏。在这里,我找到了一个函数,下面也提供了一个函数,它将文件字节存储到它自己的字节数组中。我知道 PNG 文件的前八个字节总是包含相同的十进制值 137 80 78 71 13 10 26 10(十六进制:89 50 4e 47 0d 0a 1a 0a)。当我打印以开头的字节数组的上下文-1-40-1-3201674707370011007207200-1-370-124022222232235333565555686666681088888810101010101 ...
然后将其转换为十进制值时,我在开头看不到幻数。请问,我误会了什么?我想读取图像并将其标题与十进制或十六进制值进行比较。
public static void main(String[] args)
{
File file = new File("src/resources/dog.png");
readContentIntoByteArray(file);
}
private static byte[] readContentIntoByteArray(File file)
{
FileInputStream fileInputStream = null;
byte[] bFile = new byte[(int) file.length()];
try
{
//convert file into array of bytes
fileInputStream = new FileInputStream(file);
fileInputStream.read(bFile);
fileInputStream.close();
for (int i = 0; i < bFile.length; i++)
{
System.out.print((char) bFile[i]);
}
}
catch (Exception e)
{
e.printStackTrace();
}
return bFile;
}
解决方案
正如@Andreas 所说,您正在将实际字节作为字符打印到终端,而不是用十进制或十六进制表示这些字节。
您可以检查标题:
byte[] data = readContentIntoByteArray(file);
byte[] expected = new byte[] {-119, 80, 78, 71, 13, 10, 26, 10};
for (int i = 0; i < expected.length; i++) {
if (expected[i] != data[i]) {
System.out.println("mismatch at " + i);
}
}
推荐阅读
- macos - 在 Mac os 上编译 .adb 后 Gnatmake 编译错误
- android - 如何在不同的 Android 版本上安装包
- python - 字段上的值相关字符
- adfs - 使用 ADFS 进行条件身份验证
- c# - ASP.NET Core 2.2 Web API 没有命中任何配置的路由,这是为什么呢?
- android - 带有构建工具 28 的 Android 4.1 在奇怪的地方导致 NoClassDefFoundError
- visual-studio-code - Titanium vs-code 扩展日志级别跟踪在 Mac 上不起作用。如何查看跟踪日志?
- html - 为什么当我重叠元素时我的网格会拉伸?
- docker - 连接到私有不安全注册表的 Docker Registry Mirror
- python - 在 Python 中重新组合一维数组