Как проверить, является ли файл изображением - PullRequest
0 голосов
/ 12 сентября 2018

Итак, у меня есть функция, которая проверяет тип файла, я проверяю файл по сигнатурам, но для файлов 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

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

В дополнение к первому ответу вы можете преобразовать шестнадцатеричную строку в целое число следующим образом:

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

или для больших чисел

BigInteger bigValue = new BigInteger(hex, 16);
0 голосов
/ 12 сентября 2018

Есть несколько проблем с этим кодом:

  1. Вы читаете новый Int каждый раз, когда делаете тест
  2. Вы пытаетесь проверить 4-байтовый Int против 6-байтового значения
  3. Порядок байтов будет неправильным на процессоре с прямым порядком байтов

Вот пример того, как вы можете структурировать этот код.

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
  }
}
0 голосов
/ 12 сентября 2018
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.Таким образом, вам нужно прочитать немного больше данных, чтобы соответствовать этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...