代码之家  ›  专栏  ›  技术社区  ›  Mike Kantor

iPhone JPG图像有非标准的魔法字节FF D8 FF E1?

  •  3
  • Mike Kantor  · 技术社区  · 15 年前

    在接受上传的图片之前,我的web应用程序会根据文件扩展名检查前四个字节。一个同事给我看了他iPhone上被拒绝的图片。它们有不同的第四个字节(e1=225,而不是预期的e0=224)。

    这是iPhone的常见问题吗?JPG文件中是否有其他可能使用的魔法字节字符串?

    编辑:找到此有用列表: http://www.garykessler.net/library/file_sigs.html

    3 回复  |  直到 10 年前
        1
  •  6
  •   Fredrik    15 年前

    它们似乎在某种程度上表明了jpeg的子类别。我发现FF D8 FF e0的魔力表示“jfif jpeg”,而FF D8 FF e1则表示“exif jpeg”。

    编辑 :在谷歌缓存中找到了这个: http://tinyurl.com/ydtjpjw (有趣的是,这表明三星还有更多的变种)

        2
  •  3
  •   sebilasse    10 年前

    FF总是标识一个“标记”—因为我目前正在写一个javascript文件标识符,所以我将尝试用我的javascript对象来回答jpeg…

    基本答案已经给出(被接受的答案),但这是关于如何检查不同的应用程序标记的更详细的信息(带有回退)。顺便说一句: 到目前为止,JFIF、exif、adobe、canon和三星都有专门的应用程序(但我们不知道未来)。所以JS对象的逻辑是:

    如果有一个规格[x].regex匹配,它将获胜(第一个赢得)。但是如果没有匹配的对象,则父对象(只有ffd8)获胜。

    specs对象提供 根据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'}
        ]
    }
    
        3
  •  1
  •   Sixten Otto    15 年前

    这似乎是一个完全有效的jpeg变体, 根据google

    据谷歌称.