亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢查文件是否為圖像

如何檢查文件是否為圖像

嚕嚕噠 2021-09-15 14:49:56
所以我有一個檢查文件類型的功能,我正在通過簽名檢查文件,但對于 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 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

這段代碼有多個問題:

  1. Int每次做測試時,您都在閱讀新內容

  2. 您正在嘗試Int針對 6 字節值測試 4字節

  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

  }

}


查看完整回答
反對 回復 2021-09-15
?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

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 值。所以,你需要讀取更多的數據來匹配這個。


查看完整回答
反對 回復 2021-09-15
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

除了第一個答案之外,您還可以將十六進制字符串轉換為整數,如下所示:

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

或更大的數字

BigInteger bigValue = new BigInteger(hex, 16);


查看完整回答
反對 回復 2021-09-15
  • 3 回答
  • 0 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號