我的要求是检查文件是否为jpeg / jpg / png。我写了以下代码。
public boolean isFileValid(File file) throws IOException {
DataInputStream input = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
int fileSignature = input.readInt();
input.close();
logger.info(fileSignature);
if (fileSignature == 0xffd8ffe0) {
logger.info("File is jpeg");
return true;
} else if(fileSignature == 0x89504E47){
logger.info("file is in PNG");
return true;
} else {return false;}
}
我正在使用ubuntu 13.04并且上面的代码对我来说运行正常。我读到文件签名在各种操作系统中并没有变化(虽然我没有在其他操作系统中测试过,但我不是很确定)。也是如此可以改变文件的签名吗?没有使用第三方库,有没有更好的方法呢?
答案 0 :(得分:2)
首先,你有错误的JPG幻数。它的长度不是4个字节,只有两个,它是0xffd8
(幻数的前半部分)。如果我理解你在问什么,那么魔术数字是由他们的文件类型规范定义的,并且它们应该在任何平台上始终相同。说白了,如果你有不同的幻数,那就不是你要找的文件了。当相同的文件类型有多个幻数时,有一些罕见的例外,但这通常与旧的/不同的标准兼容。
此外,如果文件具有正确的幻数,并不一定意味着它是正确类型的文件。从技术上讲,您的方法将“仅标记”文件作为正确的png / jpg图像的数据作为正确的png / jpg图像。
因此,在检查文件是否有效png / jpg的过程中,检查幻数是第一步(你可以认为它有点“文件类型哈希值”),但是如果幻数检查通过,你应该继续分析文件结构并根据其规范检查文件是否包含有意义的文件数据。
您可以在维基百科中轻松找到规范(以及官方规范的实际链接): http://en.wikipedia.org/wiki/Portable_Network_Graphics#Technical_details http://en.wikipedia.org/wiki/JPEG#Syntax_and_structure