【问题标题】:How to check if the file is image [closed]如何检查文件是否为图像[关闭]
【发布时间】:2019-02-16 20:39:59
【问题描述】:

所以我有一个检查文件类型的功能,我正在通过签名检查文件,但对于 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

【问题讨论】:

  • “它不工作”是什么意思?
  • 我正在上传 gif 文件,但函数返回 None
  • Magic cookies 也支持 47 49 46 38 37 61 用于 GIF87a。 0x47_49_46_38 将是一个 int 并且足够:“GIF8”,

标签: java scala


【解决方案1】:

这段代码存在多个问题:

  1. 每次进行测试时,您都在阅读新的Int
  2. 您正在尝试针对 6 字节值测试 4 字节 Int
  3. 字节顺序在 little-endian 处理器上会出错

这是一个示例,说明如何构建此代码。

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
  }
}

【讨论】:

    【解决方案2】:
    if (param.readInt() == 0xFFd8FFe0 | param.readInt() == 0xFFd8FFe1 )
      Some("jpg/jpeg")
    if(param.readInt() == 0x474946383961L)
      Some("gif")
    

    您继续阅读来自param 的另一个int。把它放在一个变量中:

    int magic = param.readInt();
    if (magic == 0xFFd8FFe0 | magic == 0xFFd8FFe1 )
      Some("jpg/jpeg")
    if(magic == 0x474946383961L)
      Some("gif")
    

    尽管DawoodIbnKareem 指出,magic == 0x474946383961L 永远不会为真,因为常量是 int 范围之外的长值。所以,你需要阅读更多的数据来匹配这个。

    【讨论】:

    • int 将如何成为0x474946383961L
    【解决方案3】:

    除了第一个答案,你可以将十六进制字符串转换为整数,如下所示:

    String hex = "aa"
    int value = Integer.parseInt(hex, 16);
    

    或更大的数字

    BigInteger bigValue = new BigInteger(hex, 16);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2013-08-15
      • 2014-11-15
      • 2012-11-25
      • 2014-03-11
      相关资源
      最近更新 更多