2009-12-29 544 views
2

我的網絡應用程序在接受上傳的圖像之前,先檢查文件擴展名的前四個字節。一位同事向我展示了他正在被拒絕的iPhone上的圖片。這些有不同的第四個字節(e1 = 225,而不是預期的e0 = 224)。iPhone JPG圖像具有非標準魔術字節ff d8 ff e1?

這通常是iPhone的? JPG文件中是否還有其他可能的魔術字節字符串?

編輯:發現這個有用的清單:http://www.garykessler.net/library/file_sigs.html

回答

5

他們似乎表明JPEG以某種方式子類別。我發現FF D8 FF E0 magic表示一個「JFIF JPEG」,而FF D8 FF E1表示一個「EXIF JPEG」。

編輯:發現這一個在谷歌緩存:http://tinyurl.com/ydtjpjw(有趣的,因爲它表明三星有一些更多的變化)

3

FF總是標識「標記」 - 因爲我目前正在寫一個javascript文件標識符,我會努力用我的JPEG JavaScript對象回答...

最基本的答案已經給出(接受一個),但這是更詳細的關於如何檢查不同的應用程序標記(與回退)。和btw: 到目前爲止,JFIF,EXIF,Adobe,Canon和三星都有特殊的APP0(但我們不知道未來)。所以js對象的邏輯是:

如果其中一個SPECS [x] .regex匹配,它會贏(第一個贏)。但如果沒有匹配,父對象(僅FFd8)獲勝。根據PRONOM標識符

規格對象提供- 你可以查看它們像這樣

'http://apps.nationalarchives.gov.uk/pronom/fmt/' .concat(PUID)[官] 'http://apps.nationalarchives.gov.uk/pronom/x-fmt/' .concat(xPUID)[實驗]

_FFD8: { 
    SPECS: [ 
     { 
      PUID: 112, 
      regex: /^FFD8FFE8(.{2})53504946460001/, 
      desc: 'jpeg: Still Picture Interchange Format file (SPIF)', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       version: '1.00' 
      } 
     }, 
     { 
      PUID: 44, 
      regex: /^FFD8FFE0(.{2})4A464946000102/, 
      desc: 'jpeg: JPEG File Interchange Format file (JFIF), v. 1.02', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       version: '1.02', 
      } 
     }, 
     { 
      PUID: 43, 
      regex: /^FFD8FFE0(.{2})4A464946000101/, 
      desc: 'jpeg: JPEG File Interchange Format file (JFIF), v. 1.01', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       version: '1.01', 
      } 
     }, 
     { 
      PUID: 42, 
      regex: /^FFD8FFE0(.{2})4A464946000100/, 
      desc: 'jpeg: JPEG File Interchange Format file (JFIF), v. 1.00', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       version: '1.00', 
      } 
     },   
     { 
      PUID: 41, 
      xPUID: 398, 
      regex: /^FFD8FFE1(.{2})45786966000049492A00(.+)009007000400000030323030/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), little endian, v. 2.0', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'little', 
       version: '2.0', 
      } 
     }, 
     { 
      PUID: 41, 
      xPUID: 398, 
      regex: /^FFD8FFE1(.{2})4578696600004D4D002A(.+)900000070000000430323030/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), big endian, v. 2.0', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'big', 
       version: '2.0', 
      } 
     },    
     { 
      PUID: 41, 
      xPUID: 390, 
      regex: /^FFD8FFE1(.{2})45786966000049492A00(.+)009007000400000030323130/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), little endian, v. 2.1', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'little', 
       version: '2.1', 
      } 
     }, 
     { 
      PUID: 41, 
      xPUID: 390, 
      regex: /^FFD8FFE1(.{2})4578696600004D4D002A(.+)900000070000000430323130/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), big endian, v. 2.1', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'big', 
       version: '2.1', 
      } 
     },   
     { 
      PUID: 41, 
      xPUID: 391, 
      regex: /^FFD8FFE1(.{2})45786966000049492A00(.+)009007000400000030323230/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), little endian, v. 2.2', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'little', 
       version: '2.2', 
      } 
     }, 
     { 
      PUID: 41, 
      xPUID: 391, 
      regex: /^FFD8FFE1(.{2})4578696600004D4D002A(.+)900000070000000430323230/, 
      desc: 'jpeg: JPG Image File, using Exchangeable Image File Format (Exif), big endian, v. 2.2', 
      regexCapture: [ 
       { key: 'recordedSignature' }, 
       { key: 'segmentLength', fn: function(h){ return { value:parseInt(h, 16), _val:h.toString() }; } } 
      ], 
      valueCapture: { 
       endian: 'big', 
       version: '2.2', 
      } 
     }, 
     // specific JPEG (all begin with FFD8FF, map them to PUID 41) 
     { 
      PUID: 41, 
      regex: /^FFD8FFED/, 
      desc: 'jpeg: JPG Image File, Adobe JPEG, Photoshop CMYK buffer' 
     }, 
     { 
      PUID: 41, 
      regex: /^FFD8FFE2/, 
      desc: 'jpeg: JPG Image File, Canon JPEG, Canon EOS-1D' 
     }, 
     { 
      PUID: 41, 
      regex: /^FFD8FFE3/, 
      desc: 'jpeg: JPG Image File, Samsung JPEG, e.g. Samsung D500' 
     }, 
     { 
      PUID: 41, 
      regex: /^FFD8FFDB/, 
      desc: 'jpeg: JPG Image File, Samsung JPEG, e.g. Samsung D807' 
     } 
    ], 
    ext: ['JPG', 'JPE', 'JPEG', 'SPF', 'SPIFF'], 
    signature: [ 255, 216 ], 
    desc: 'jpeg: JPEG File Interchange Format file, App0 marker not known', 
    mime: 'image/jpeg', 
    specifications: [ 
     { text:'Specification for the JFIF file format', href:'http://www.w3.org/Graphics/JPEG/jfif3.pdf', type:'W3', format:'pdf' }, 
     { text:'The JPEG compression specification', href:'http://www.w3.org/Graphics/JPEG/itu-t81.pdf', type:'W3', format:'pdf' }, 
     { text:'Exchangeable image file format for digital still cameras', href:'http://home.jeita.or.jp/tsc/std-pdf/CP3451C.pdf', type:'vendor', format:'pdf' } 
    ], 
    references: [ 
     { text:'JPEG JFIF W3 Info', href:'http://www.w3.org/Graphics/JPEG/', type:'W3', format:'html' }, 
     { text:'JPEG.org', href:'http://www.jpeg.org/', type:'info', format:'html' }, 
     { text:'JPEG Exif App markers', href:'http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html', type:'info', format:'html'} 
    ] 
}