Адам указывает в правильном направлении.
Если вы хотите узнать, как воспринимать практически любой файл , посмотрите на базу данных, стоящую за командой file
на компьютере с UNIX, Linux или Mac OS X.
file
использует базу данных «магических чисел» - тех начальных байтов, перечисленных Адамом - для определения типа файла. man file
скажет вам, где найти базу данных на вашем компьютере, например, /usr/share/file/magic
. man magic
сообщит вам свой формат .
Вы можете написать свой собственный код обнаружения на основе того, что вы видите в базе данных, использовать предварительно упакованные библиотеки (например, python-magic ) или - если вы действительно авантюрный - внедрить .NET-версию libmagic
. Я не мог найти один, и надеюсь, что другой участник может указать один.
Если у вас нет под рукой UNIX-машины, база данных выглядит так:
# PNG [Portable Network Graphics, or "PNG's Not GIF"] images
# (Greg Roelofs, newt@uchicago.edu)
# (Albert Cahalan, acahalan@cs.uml.edu)
#
# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
#
0 string \x89PNG PNG image data,
>4 belong !0x0d0a1a0a CORRUPTED,
>4 belong 0x0d0a1a0a
>>16 belong x %ld x
>>20 belong x %ld,
>>24 byte x %d-bit
>>25 byte 0 grayscale,
>>25 byte 2 \b/color RGB,
>>25 byte 3 colormap,
>>25 byte 4 gray+alpha,
>>25 byte 6 \b/color RGBA,
#>>26 byte 0 deflate/32K,
>>28 byte 0 non-interlaced
>>28 byte 1 interlaced
1 string PNG PNG image data, CORRUPTED
# GIF
0 string GIF8 GIF image data
>4 string 7a \b, version 8%s,
>4 string 9a \b, version 8%s,
>6 leshort >0 %hd x
>8 leshort >0 %hd
#>10 byte &0x80 color mapped,
#>10 byte&0x07 =0x00 2 colors
#>10 byte&0x07 =0x01 4 colors
#>10 byte&0x07 =0x02 8 colors
#>10 byte&0x07 =0x03 16 colors
#>10 byte&0x07 =0x04 32 colors
#>10 byte&0x07 =0x05 64 colors
#>10 byte&0x07 =0x06 128 colors
#>10 byte&0x07 =0x07 256 colors
Удачи!