猿问

如何检查文件是否为图像

所以我有一个检查文件类型的功能,我正在通过签名检查文件,但对于 GIF 文件它不起作用


 def checkPhotoType(file: File): Option[String] = {

    val param = new DataInputStream(new BufferedInputStream(new FileInputStream(file)))

    if (param.readInt() == 0xFFd8FFe0 | param.readInt() == 0xFFd8FFe1 )

      Some("jpg/jpeg")

    if(param.readInt() == 0x474946383961L)

      Some("gif")

    else None


噜噜哒
浏览 167回答 3
3回答

白板的微信

这段代码有多个问题:Int每次做测试时,您都在阅读新内容您正在尝试Int针对 6 字节值测试 4字节字节顺序在小端处理器上是错误的下面是一个示例,说明如何构造此代码。def checkPhotoType(file: File): Option[String] = {  val param = new DataInputStream(new BufferedInputStream(new FileInputStream(file)))  val bytes = (1 to 6).map( _ => param.readByte).toList  bytes match {    case List(0xFF, 0xD8, 0xFF, 0xDB, _, _) =>      Some("jpg/jpeg")    case List(0x47, 0x49, 0x46, 0x38, 0x37, 0x61) =>      Some("GIF87a")    case List(0x47, 0x49, 0x46, 0x38, 0x39, 0x61) =>      Some("GIF89a")    case _ =>      None  }}

慕田峪4524236

if (param.readInt() == 0xFFd8FFe0 | param.readInt() == 0xFFd8FFe1 )  Some("jpg/jpeg")if(param.readInt() == 0x474946383961L)  Some("gif")你继续int从param. 把它放在一个变量中:int magic = param.readInt();if (magic == 0xFFd8FFe0 | magic == 0xFFd8FFe1 )  Some("jpg/jpeg")if(magic == 0x474946383961L)  Some("gif")尽管正如DawoodIbnKareem指出的那样,magic == 0x474946383961L永远不会为真,因为常量是 int 范围之外的 long 值。所以,你需要读取更多的数据来匹配这个。

胡子哥哥

除了第一个答案之外,您还可以将十六进制字符串转换为整数,如下所示:String hex = "aa" int value = Integer.parseInt(hex, 16);或更大的数字BigInteger bigValue = new BigInteger(hex, 16);
随时随地看视频慕课网APP

相关分类

Java
我要回答