sixarm_ruby_magic_number_type 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +1 -2
- data/.gemtest +0 -0
- data/README.md +104 -0
- data/Rakefile +8 -0
- data/VERSION +1 -0
- data/lib/sixarm_ruby_magic_number_type.rb +4 -140
- data/lib/sixarm_ruby_magic_number_type/file.rb +24 -0
- data/lib/sixarm_ruby_magic_number_type/io.rb +33 -0
- data/lib/sixarm_ruby_magic_number_type/string.rb +136 -0
- data/test/sixarm_ruby_magic_number_type_test.rb +9 -0
- data/test/sixarm_ruby_magic_number_type_test/file_test.rb +35 -0
- data/test/sixarm_ruby_magic_number_type_test/io_test.rb +13 -0
- data/test/sixarm_ruby_magic_number_type_test/samples/sample.bz2 +0 -0
- data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.fit +0 -0
- data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.gif +0 -0
- data/test/sixarm_ruby_magic_number_type_test/samples/sample.gz +0 -0
- data/test/sixarm_ruby_magic_number_type_test/samples/sample.html +1 -0
- data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.jpg +0 -0
- data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.png +0 -0
- data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.ps +0 -0
- data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.ras +0 -0
- data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.sgi +0 -0
- data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.tiff +0 -0
- data/test/sixarm_ruby_magic_number_type_test/samples/sample.xml +1 -0
- data/test/sixarm_ruby_magic_number_type_test/string_test.rb +94 -0
- metadata +88 -64
- metadata.gz.sig +0 -0
- data/LICENSE.txt +0 -12
- data/README.rdoc +0 -30
- data/test/sixarm_ruby_magic_number_type/sample.xcf.bz2 +0 -0
- data/test/sixarm_ruby_magic_number_type/sample.xcf.gz +0 -0
data.tar.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
�
|
2
|
-
µ�4L-.�>϶�A��ҡ��~.�
|
1
|
+
7vŏ���D��&�Fҧ���H:�ZD!��v\!����>!v;�$1����nT���D��d�9O���V�PYS}�M�F�U'�<s�r�N��u��,�O��t�sH��t=�M�E(%� z�o�
|
data/.gemtest
ADDED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# SixArm.com » Ruby » <br> MagicNumberType infers mime types from leading bits
|
2
|
+
|
3
|
+
* Doc: <http://sixarm.com/sixarm_ruby_magic_number_type/doc>
|
4
|
+
* Gem: <http://rubygems.org/gems/sixarm_ruby_magic_number_type>
|
5
|
+
* Repo: <http://github.com/sixarm/sixarm_ruby_magic_number_type>
|
6
|
+
* Email: Joel Parker Henderson, <joel@sixarm.com>
|
7
|
+
|
8
|
+
|
9
|
+
## Introduction
|
10
|
+
|
11
|
+
|
12
|
+
Magic numbers are the first bits of a file or data stream
|
13
|
+
which uniquely identify the type of file or data stream.
|
14
|
+
|
15
|
+
For example when the first bits are "BM",
|
16
|
+
this identifies the file as a bitmap image file.
|
17
|
+
|
18
|
+
For docs go to <http://sixarm.com/sixarm_ruby_magic_number_type/doc>
|
19
|
+
|
20
|
+
Want to help? We're happy to get pull requests.
|
21
|
+
|
22
|
+
|
23
|
+
## Install quickstart
|
24
|
+
|
25
|
+
Install:
|
26
|
+
|
27
|
+
gem install sixarm_ruby_magic_number_type
|
28
|
+
|
29
|
+
Gemfile:
|
30
|
+
|
31
|
+
gem "sixarm_ruby_magic_number_type", "~>2.0.0"
|
32
|
+
|
33
|
+
Require:
|
34
|
+
|
35
|
+
require "sixarm_ruby_magic_number_type"
|
36
|
+
|
37
|
+
|
38
|
+
## Install with security (optional)
|
39
|
+
|
40
|
+
To enable high security for all our gems:
|
41
|
+
|
42
|
+
wget http://sixarm.com/sixarm.pem
|
43
|
+
gem cert --add sixarm.pem
|
44
|
+
gem sources --add http://sixarm.com
|
45
|
+
|
46
|
+
To install with high security:
|
47
|
+
|
48
|
+
gem install sixarm_ruby_magic_number_type --test --trust-policy HighSecurity
|
49
|
+
|
50
|
+
|
51
|
+
## Details
|
52
|
+
|
53
|
+
This gem infers based on widespread programming conventions for data file formats.
|
54
|
+
|
55
|
+
These magic numbers are by convention and we are using this guide:
|
56
|
+
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
|
57
|
+
|
58
|
+
Typical uses of magic numbers:
|
59
|
+
|
60
|
+
* to quickly identify a file's data type
|
61
|
+
* to check if data matches the file's MIME type or extension
|
62
|
+
* to check if a web form file upload matches its HTTP content type
|
63
|
+
|
64
|
+
Compare:
|
65
|
+
|
66
|
+
* MIME::Types ruby library
|
67
|
+
* Unix magic() command for testing files on disk
|
68
|
+
* http://shared-mime.rubyforge.org/
|
69
|
+
|
70
|
+
|
71
|
+
## Changes
|
72
|
+
|
73
|
+
* 2012-09-08 2.0.0 Upgrade with more formats, samples, classes, and hex packing
|
74
|
+
* 2012-04-20 1.2.0 Upgrade to much faster algorithm
|
75
|
+
* 2012-03-14 1.1.0 Update docs, tests
|
76
|
+
|
77
|
+
|
78
|
+
## License
|
79
|
+
|
80
|
+
You may choose any of these open source licenses:
|
81
|
+
|
82
|
+
* Apache License
|
83
|
+
* BSD License
|
84
|
+
* CreativeCommons License, Non-commercial Share Alike
|
85
|
+
* GNU General Public License Version 2 (GPL 2)
|
86
|
+
* GNU Lesser General Public License (LGPL)
|
87
|
+
* MIT License
|
88
|
+
* Perl Artistic License
|
89
|
+
* Ruby License
|
90
|
+
|
91
|
+
The software is provided "as is", without warranty of any kind,
|
92
|
+
express or implied, including but not limited to the warranties of
|
93
|
+
merchantability, fitness for a particular purpose and noninfringement.
|
94
|
+
|
95
|
+
In no event shall the authors or copyright holders be liable for any
|
96
|
+
claim, damages or other liability, whether in an action of contract,
|
97
|
+
tort or otherwise, arising from, out of or in connection with the
|
98
|
+
software or the use or other dealings in the software.
|
99
|
+
|
100
|
+
This license is for the included software that is created by SixArm;
|
101
|
+
some of the included software may have its own licenses, copyrights,
|
102
|
+
authors, etc. and these do take precedence over the SixArm license.
|
103
|
+
|
104
|
+
Copyright (c) 2005-2013 Joel Parker Henderson
|
data/Rakefile
ADDED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
@@ -1,144 +1,8 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
=begin rdoc
|
3
|
-
|
4
|
-
= SixArm.com » Ruby » MagicNumberType
|
5
|
-
|
6
|
-
Author:: Joel Parker Henderson, joelparkerhenderson@gmail.com
|
7
|
-
Copyright:: Copyright (c) 2010 Joel Parker Henderson
|
8
|
-
License:: See LICENSE.txt file
|
9
|
-
|
10
|
-
MagicNumberType infers a data type from the data's leading bytes.
|
11
|
-
|
12
|
-
It infers based on widespread programming conventions for data file formats.
|
13
|
-
|
14
|
-
Magic numbers are the first bits of a file or data stream
|
15
|
-
which uniquely identify the type of file or data stream.
|
16
|
-
|
17
|
-
For example when the first bits are "BM",
|
18
|
-
this identifies the file as a bitmap image file.
|
19
|
-
|
20
|
-
These magic numbers are by convention and we are using this guide:
|
21
|
-
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
|
22
|
-
|
23
|
-
Typical uses of magic numbers:
|
24
|
-
- to quickly identify a file's data type
|
25
|
-
- to check if data matches the file's MIME type or extension
|
26
|
-
- to check if a web form file upload matches its HTTP content type
|
27
|
-
|
28
|
-
Compare:
|
29
|
-
- MIME::Types ruby library
|
30
|
-
- Unix magic() command for testing files on disk
|
31
|
-
- http://shared-mime.rubyforge.org/
|
32
|
-
|
3
|
+
Please see README
|
33
4
|
=end
|
34
5
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
# We implement magic by using a lookup hash.
|
40
|
-
# The key is a string that encodes the first bits.
|
41
|
-
# The value is a symbol that indicates the magic type.
|
42
|
-
#
|
43
|
-
# Examples:
|
44
|
-
# IO::MagicNumberType("BM") => :bitmap
|
45
|
-
# IO::MagicNumberType("GIF8") => :gif
|
46
|
-
# IO::MagicNumberType("\xa6\x00") => :pgp_encrypted_data
|
47
|
-
#
|
48
|
-
# Quirks:
|
49
|
-
# - JPEG adjustment:
|
50
|
-
# - Some cameras put JPEG Exif data in bytes 3 & 4,
|
51
|
-
# so we only check the first two bytes of a JPEG.
|
52
|
-
# - TIFF has two possible matches:
|
53
|
-
# - MM** is Motorola big endian
|
54
|
-
# - II** is Intel little ending
|
55
|
-
#
|
56
|
-
# See:
|
57
|
-
# - IO#magic_number_type
|
58
|
-
# - File.magic_number_type
|
59
|
-
|
60
|
-
MagicNumberTypeHash = {
|
61
|
-
"BC" => :bitcode,
|
62
|
-
"BM" => :bitmap,
|
63
|
-
"BZ" => :bzip,
|
64
|
-
"MZ" => :exe,
|
65
|
-
"SIMPLE"=> :fits,
|
66
|
-
"GIF8" => :gif,
|
67
|
-
"GKSM" => :gks,
|
68
|
-
[0x01,0xDA].pack('c*') => :iris_rgb,
|
69
|
-
[0xF1,0x00,0x40,0xBB].pack('c*') => :itc,
|
70
|
-
[0xFF,0xD8].pack('c*') => :jpeg,
|
71
|
-
"IIN1" => :niff,
|
72
|
-
"MThd" => :midi,
|
73
|
-
"%PDF" => :pdf,
|
74
|
-
"VIEW" => :pm,
|
75
|
-
[0x89].pack('c*') + "PNG" => :png,
|
76
|
-
"%!" => :postscript,
|
77
|
-
"Y" + [0xA6].pack('c*') + "j" + [0x95].pack('c*') => :sun_rasterfile,
|
78
|
-
"MM*" + [0x00].pack('c*') => :tiff,
|
79
|
-
"II*" + [0x00].pack('c*') => :tiff,
|
80
|
-
"gimp xcf" => :gimp_xcf,
|
81
|
-
"#FIG" => :xfig,
|
82
|
-
"/* XPM */" => :xpm,
|
83
|
-
[0x23,0x21].pack('c*') => :shebang,
|
84
|
-
[0x1F,0x9D].pack('c*') => :compress,
|
85
|
-
[0x1F,0x8B].pack('c*') => :gzip,
|
86
|
-
"PK" + [0x03,0x04].pack('c*') => :pkzip,
|
87
|
-
"MZ" => :dos_os2_windows_executable,
|
88
|
-
".ELF" => :unix_elf,
|
89
|
-
[0x99,0x00].pack('c*') => :pgp_public_ring,
|
90
|
-
[0x95,0x01].pack('c*') => :pgp_security_ring,
|
91
|
-
[0x95,0x00].pack('c*') => :pgp_security_ring,
|
92
|
-
[0xA6,0x00].pack('c*') => :pgp_encrypted_data,
|
93
|
-
[0xD0,0xCF,0x11,0xE0].pack('c*') => :docfile
|
94
|
-
}
|
95
|
-
|
96
|
-
# Detect the data type by checking various "magic number" conventions
|
97
|
-
# for the introductory bytes of a data stream
|
98
|
-
#
|
99
|
-
# Return the "magic number" as a symbol:
|
100
|
-
# - :bitmap = Bitmap image file, typical extension ".bmp"
|
101
|
-
# - :gzip = Unix GZIP compressed data, typical extension ".gz"
|
102
|
-
# - :postscript = Postscript pages, typical extension ".ps"
|
103
|
-
#
|
104
|
-
# Return nil if there's no match for any known magic number.
|
105
|
-
#
|
106
|
-
# Example:
|
107
|
-
# f = File.open("test.ps","rb")
|
108
|
-
# put f.magic_number(s)
|
109
|
-
# => :postscript
|
110
|
-
#
|
111
|
-
# See:
|
112
|
-
# - IO::MagicNumberTypeHash
|
113
|
-
# - File.magic_number_type
|
114
|
-
|
115
|
-
def magic_number_type(bytes=self.read(9))
|
116
|
-
MagicNumberTypeHash.each_pair do |byte_string,type_symbol|
|
117
|
-
return type_symbol if byte_string==bytes[0,byte_string.length]
|
118
|
-
end
|
119
|
-
return nil
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
class File
|
126
|
-
|
127
|
-
# Detect the file's data type by opening the file then
|
128
|
-
# using IO#magic_number_type to read the first bits.
|
129
|
-
#
|
130
|
-
# Return a magic number type symbol, e.g. :bitmap, :jpg, etc.
|
131
|
-
#
|
132
|
-
# Example:
|
133
|
-
# puts File.magic_number_type("test.ps") => :postscript
|
134
|
-
#
|
135
|
-
# See
|
136
|
-
# - IO#MagicNumberTypeHash
|
137
|
-
# - IO#magic_number_type
|
138
|
-
|
139
|
-
def self.magic_number_type(file_name)
|
140
|
-
File.open(file_name,"rb"){|f| f.magic_number_type }
|
141
|
-
end
|
142
|
-
|
143
|
-
end
|
144
|
-
|
6
|
+
['file','io','string'].map{|x|
|
7
|
+
require File.dirname(__FILE__) + "/sixarm_ruby_magic_number_type/#{x}.rb"
|
8
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class File
|
4
|
+
|
5
|
+
# Detect the file's data type by opening the file then
|
6
|
+
# using IO#magic_number_type to read the first bits.
|
7
|
+
#
|
8
|
+
# Return a magic number type symbol, e.g. :bitmap, :jpg, etc.
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
# puts File.magic_number_type("test.ps") => :postscript
|
12
|
+
#
|
13
|
+
# See
|
14
|
+
# - IO#MagicNumberTypeHash
|
15
|
+
# - IO#magic_number_type
|
16
|
+
#
|
17
|
+
def self.magic_number_type(file_name)
|
18
|
+
f = File.open(file_name,"rb")
|
19
|
+
type = f.magic_number_type
|
20
|
+
f.close
|
21
|
+
return type
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class IO
|
4
|
+
|
5
|
+
# Detect the data type by checking various "magic number" conventions
|
6
|
+
# for the introductory bytes of a data stream
|
7
|
+
#
|
8
|
+
# Return the "magic number" as a symbol:
|
9
|
+
# - :bitmap = Bitmap image file, typical extension ".bmp"
|
10
|
+
# - :gzip = Unix GZIP compressed data, typical extension ".gz"
|
11
|
+
# - :postscript = Postscript pages, typical extension ".ps"
|
12
|
+
#
|
13
|
+
# Return nil if there's no match for any known magic number.
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
# IO.f = File.open("test.ps","rb")
|
17
|
+
# put f.magic_number(s)
|
18
|
+
# => :postscript
|
19
|
+
#
|
20
|
+
# See:
|
21
|
+
# - IO::MagicNumberTypeHash
|
22
|
+
# - File.magic_number_type
|
23
|
+
#
|
24
|
+
# TODO change from hash implementation to binary tree
|
25
|
+
|
26
|
+
def magic_number_type(bytes=self.read(String::MagicNumberTypeMaxLength))
|
27
|
+
String::MagicNumberTypeHash.each_pair do |byte_string,type_symbol|
|
28
|
+
return type_symbol if byte_string==bytes[0,byte_string.length]
|
29
|
+
end
|
30
|
+
return nil
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
=begin rdoc
|
3
|
+
Please see README
|
4
|
+
=end
|
5
|
+
|
6
|
+
class String
|
7
|
+
|
8
|
+
# We implement magic number type by using a lookup hash.
|
9
|
+
# This is fast enough for our needs; it could be optimized.
|
10
|
+
#
|
11
|
+
# The key is a string that encodes the first bits.
|
12
|
+
# The value is a symbol that indicates the magic type.
|
13
|
+
#
|
14
|
+
# See:
|
15
|
+
# - IO#magic_number_type
|
16
|
+
# - File.magic_number_type
|
17
|
+
#
|
18
|
+
# Quirks:
|
19
|
+
# - JPEG adjustment:
|
20
|
+
# - Some cameras put JPEG Exif data in bytes 3 & 4,
|
21
|
+
# so we only check the first two bytes of a JPEG.
|
22
|
+
# - TIFF has two possible matches:
|
23
|
+
# - II.. Intel little ending ("II2A00")
|
24
|
+
# - MM.. Motorola big endian ("MM002A")
|
25
|
+
#
|
26
|
+
# TODO change from hash implementation to binary tree
|
27
|
+
#
|
28
|
+
MagicNumberTypeHash = {
|
29
|
+
"<!doctyp" => :html,
|
30
|
+
"<html" => :html,
|
31
|
+
"<?xml" => :xml,
|
32
|
+
"<MakerFile" => :adobe_framemaker,
|
33
|
+
"BC" => :bitcode,
|
34
|
+
"BM" => :bitmap,
|
35
|
+
"BZ" => :bzip,
|
36
|
+
"MZ" => :exe,
|
37
|
+
"SIMPLE"=> :fits,
|
38
|
+
"GIF8" => :gif,
|
39
|
+
"GKSM" => :gks,
|
40
|
+
["01DA"].pack('H*') => :iris_rgb,
|
41
|
+
["F10040BB"].pack('H*') => :itc,
|
42
|
+
["FFD8"].pack('H*') => :jpeg,
|
43
|
+
"IIN1" => :niff,
|
44
|
+
"MThd" => :midi,
|
45
|
+
"%PDF" => :pdf,
|
46
|
+
"VIEW" => :pm,
|
47
|
+
["89504E470D0A1A0A"].pack('H*') => :png,
|
48
|
+
"Y" + ["A6"].pack('H*') + "j" + ["95"].pack('H*') => :sun_rasterfile,
|
49
|
+
"II" + ["2A00"].pack('H*') => :tiff, # II means Intel format, then 42 little-endian
|
50
|
+
"MM" + ["002A"].pack('H*') => :tiff, # MM means Motorola format, then 42 big-endian
|
51
|
+
"gimp xcf" => :gimp_xcf,
|
52
|
+
"#FIG" => :xfig,
|
53
|
+
"/* XPM */" => :xpm,
|
54
|
+
["1F9D"].pack('H*') => :compress,
|
55
|
+
["1F8B"].pack('H*') => :gzip,
|
56
|
+
"\x1F\xA0" => :tar_file_using_lzh_compression,
|
57
|
+
"PK\x03\x04" => :pkzip,
|
58
|
+
"7Z\xBC\xAF\x27\x1C" => :seven_zip,
|
59
|
+
"MZ" => :dos_os2_windows_executable,
|
60
|
+
".ELF" => :unix_elf,
|
61
|
+
"\x99\x00" => :pgp_public_ring,
|
62
|
+
"\x95\x01" => :pgp_security_ring,
|
63
|
+
"\x95\x00" => :pgp_security_ring,
|
64
|
+
"\xA6\x00" => :pgp_encrypted_data,
|
65
|
+
"\xD0\xCF\x11\xE0" => :docfile,
|
66
|
+
#TODO matroska seems to have multiple magic file types-- diagnose and fix
|
67
|
+
#"\x1a\x45\xdf\xa3\xa3\x42\x86\x81\x01\x42\xf7\x81\x01\x42\xf2\x81\x04\x42\xf3\x81\x08\x42\x82\x88matroska" => :matroska_stream,
|
68
|
+
".RTS COMPRESSED IMAGE" => :runtime_software_disk_image,
|
69
|
+
"WS" => :wordstar_document,
|
70
|
+
"!BDN" => :microsoft_outlook_personal_folder_file,
|
71
|
+
"# Disk Descripto" => :vmware_disk_description,
|
72
|
+
"# Microsoft Developer Studio" => :microsoft_developer_studio,
|
73
|
+
"#!AMR" => :adaptive_multi_rate,
|
74
|
+
"#?RADIANCE." => :radiance_high_dynamic_range_image_file,
|
75
|
+
"%!PS-Adobe-3.0 EPSF-3.0" => :encapsulated_postscript,
|
76
|
+
"8BPS" => :adobe_photoshop,
|
77
|
+
"\x00\xBF" => :adobe_flash_shared_object, # Typically a flash cookie
|
78
|
+
"\x00\x00\x00\x14ftypisom" => :iso_base_media, # ISO Base Media file (MPEG-4) v1
|
79
|
+
"\x00\x00\x00\x14ftypqt" => :quicktime_movie,
|
80
|
+
"\x00\x00\x00\x14fty3gp5" => :mpeg4_video,
|
81
|
+
"\x00\x00\x00\x14ftymp42" => :mpeg4_video_quicktime,
|
82
|
+
"\x00\x00\x00\x14ftyM4A" => :app_lossless_audio_codec,
|
83
|
+
"\x00\x01\x00\x00MYISAM DATABASE" => :msisam_database, # e.g. Microsoft Money
|
84
|
+
"\x00\x01\x00\x00Standard ACE DB" => :microsoft_access_ace_db,
|
85
|
+
"\x00\x01\x00\x00Standard Jet DB" => :microsoft_access_jet_db,
|
86
|
+
"\x00\x01BA" => :palm_address_book,
|
87
|
+
"\x00\x01BD" => :palm_date_book,
|
88
|
+
"\x01\x0F\x00\x00" => :microsoft_sql_server_2000,
|
89
|
+
"(This file must be converted with BinHex" => :binhex,
|
90
|
+
"*** Installation Started" => :symantec_wise_installer_log_file,
|
91
|
+
".REC" => :realplayer_video,
|
92
|
+
".RMF" => :realplayer_media,
|
93
|
+
"01ORDNANCE SURVEY" => :national_transfer_format_map,
|
94
|
+
"\x31\xBE" => :microsoft_write,
|
95
|
+
"\x32\xBE" => :microsoft_write,
|
96
|
+
"4" + ["CDB2A1"].pack('H*') => :tcpdump,
|
97
|
+
":VERSION" => :surfplan_kite_project,
|
98
|
+
"AC10" => :autocad,
|
99
|
+
".snd" => :sun_microsystems_law_audio_file,
|
100
|
+
# Short ones below that would mask longer ones above
|
101
|
+
"\x23\x21" => :shebang,
|
102
|
+
"%!" => :postscript
|
103
|
+
}
|
104
|
+
|
105
|
+
MagicNumberTypeMaxLength = 64 # Longest key
|
106
|
+
|
107
|
+
|
108
|
+
# Detect the data type by checking various "magic number" conventions
|
109
|
+
# for the introductory bytes of a data stream
|
110
|
+
#
|
111
|
+
# Return the "magic number" as a symbol:
|
112
|
+
# - :bitmap = Bitmap image file, typical extension ".bmp"
|
113
|
+
# - :gzip = Unix GZIP compressed data, typical extension ".gz"
|
114
|
+
# - :postscript = Postscript pages, typical extension ".ps"
|
115
|
+
#
|
116
|
+
# Return nil if there's no match for any known magic number.
|
117
|
+
#
|
118
|
+
# Examples:
|
119
|
+
# "BM".magic_number_type => :bitmap
|
120
|
+
# "GIF8".magic_numer_type => :gif
|
121
|
+
# "\xa6\x00".magic_number_type => :pgp_encrypted_data
|
122
|
+
#
|
123
|
+
# TODO change from hash implementation to binary tree
|
124
|
+
#
|
125
|
+
def magic_number_type
|
126
|
+
String::MagicNumberTypeHash.each_pair do |byte_string,type_symbol|
|
127
|
+
return type_symbol if byte_string==self.byteslice(0,byte_string.length)
|
128
|
+
end
|
129
|
+
return nil
|
130
|
+
end
|
131
|
+
|
132
|
+
protected
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start
|
5
|
+
require 'sixarm_ruby_magic_number_type'
|
6
|
+
|
7
|
+
describe File do
|
8
|
+
|
9
|
+
before do
|
10
|
+
SAMPLE_FILE_NAME_TO_MAGIC_NUMBER_TYPE ||= {
|
11
|
+
'sample.fit' => :fits,
|
12
|
+
'sample.gif' => :gif,
|
13
|
+
'sample.html' => :html,
|
14
|
+
'sample.xml' => :xml,
|
15
|
+
'sample.jpg' => :jpeg,
|
16
|
+
'sample.png' => :png,
|
17
|
+
'sample.ps' => :postscript,
|
18
|
+
'sample.ras' => :sun_rasterfile,
|
19
|
+
'sample.sgi' => :iris_rgb,
|
20
|
+
'sample.tiff' => :tiff,
|
21
|
+
'sample.bz2' => :bzip,
|
22
|
+
'sample.gz' => :gzip,
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
it "solves the magic number type" do
|
27
|
+
SAMPLE_FILE_NAME_TO_MAGIC_NUMBER_TYPE.each_pair{|file_name, type|
|
28
|
+
path = File.join("test","sixarm_ruby_magic_number_type_test","samples",file_name)
|
29
|
+
File.exist?(path).must_equal true
|
30
|
+
File.magic_number_type(path).must_equal type, "Trying #{file_name}"
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start
|
5
|
+
require 'sixarm_ruby_magic_number_type'
|
6
|
+
|
7
|
+
describe IO do
|
8
|
+
|
9
|
+
# So far, all our needs go through File.
|
10
|
+
# If you want to add tests here, please do.
|
11
|
+
|
12
|
+
end
|
13
|
+
|
Binary file
|
data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.fit
RENAMED
File without changes
|
data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.gif
RENAMED
File without changes
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
<html></html>
|
data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.jpg
RENAMED
File without changes
|
data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.png
RENAMED
File without changes
|
data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.ps
RENAMED
File without changes
|
data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.ras
RENAMED
File without changes
|
data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.sgi
RENAMED
File without changes
|
data/test/{sixarm_ruby_magic_number_type → sixarm_ruby_magic_number_type_test/samples}/sample.tiff
RENAMED
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml></xml>
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start
|
5
|
+
require 'sixarm_ruby_magic_number_type'
|
6
|
+
|
7
|
+
|
8
|
+
describe String do
|
9
|
+
|
10
|
+
before do
|
11
|
+
SAMPLE_STRING_TO_MAGIC_NUMBER_TYPE ||= {
|
12
|
+
"<!doctyp" => :html,
|
13
|
+
"<html" => :html,
|
14
|
+
"<?xml" => :xml,
|
15
|
+
"<MakerFile" => :adobe_framemaker,
|
16
|
+
"BC" => :bitcode,
|
17
|
+
"BM" => :bitmap,
|
18
|
+
"BZ" => :bzip,
|
19
|
+
"MZ" => :exe,
|
20
|
+
"SIMPLE"=> :fits,
|
21
|
+
"GIF8" => :gif,
|
22
|
+
"GKSM" => :gks,
|
23
|
+
["01DA"].pack('H*') => :iris_rgb,
|
24
|
+
["F10040BB"].pack('H*') => :itc,
|
25
|
+
["FFD8"].pack('H*') => :jpeg,
|
26
|
+
"IIN1" => :niff,
|
27
|
+
"MThd" => :midi,
|
28
|
+
"%PDF" => :pdf,
|
29
|
+
"VIEW" => :pm,
|
30
|
+
["89504E470D0A1A0A"].pack('H*') => :png,
|
31
|
+
"Y" + ["A6"].pack('H*') + "j" + ["95"].pack('H*') => :sun_rasterfile,
|
32
|
+
"II" + ["2A00"].pack('H*') => :tiff, # II means Intel format, then 42 little-endian
|
33
|
+
"MM" + ["002A"].pack('H*') => :tiff, # MM means Motorola format, then 42 big-endian
|
34
|
+
"gimp xcf" => :gimp_xcf,
|
35
|
+
"#FIG" => :xfig,
|
36
|
+
"/* XPM */" => :xpm,
|
37
|
+
["1F9D"].pack('H*') => :compress,
|
38
|
+
["1F8B"].pack('H*') => :gzip,
|
39
|
+
"\x1F\xA0" => :tar_file_using_lzh_compression,
|
40
|
+
"PK\x03\x04" => :pkzip,
|
41
|
+
"7Z\xBC\xAF\x27\x1C" => :seven_zip,
|
42
|
+
"MZ" => :dos_os2_windows_executable,
|
43
|
+
".ELF" => :unix_elf,
|
44
|
+
"\x99\x00" => :pgp_public_ring,
|
45
|
+
"\x95\x01" => :pgp_security_ring,
|
46
|
+
"\x95\x00" => :pgp_security_ring,
|
47
|
+
"\xA6\x00" => :pgp_encrypted_data,
|
48
|
+
"\xD0\xCF\x11\xE0" => :docfile,
|
49
|
+
#TODO matroska seems to have multiple magic file types-- diagnose and fix
|
50
|
+
#"\x1a\x45\xdf\xa3\xa3\x42\x86\x81\x01\x42\xf7\x81\x01\x42\xf2\x81\x04\x42\xf3\x81\x08\x42\x82\x88matroska" => :matroska_stream,
|
51
|
+
".RTS COMPRESSED IMAGE" => :runtime_software_disk_image,
|
52
|
+
"WS" => :wordstar_document,
|
53
|
+
"!BDN" => :microsoft_outlook_personal_folder_file,
|
54
|
+
"# Disk Descripto" => :vmware_disk_description,
|
55
|
+
"# Microsoft Developer Studio" => :microsoft_developer_studio,
|
56
|
+
"#!AMR" => :adaptive_multi_rate,
|
57
|
+
"#?RADIANCE." => :radiance_high_dynamic_range_image_file,
|
58
|
+
"%!PS-Adobe-3.0 EPSF-3.0" => :encapsulated_postscript,
|
59
|
+
"8BPS" => :adobe_photoshop,
|
60
|
+
"\x00\xBF" => :adobe_flash_shared_object, # Typically a flash cookie
|
61
|
+
"\x00\x00\x00\x14ftypisom" => :iso_base_media, # ISO Base Media file (MPEG-4) v1
|
62
|
+
"\x00\x00\x00\x14ftypqt" => :quicktime_movie,
|
63
|
+
"\x00\x00\x00\x14fty3gp5" => :mpeg4_video,
|
64
|
+
"\x00\x00\x00\x14ftymp42" => :mpeg4_video_quicktime,
|
65
|
+
"\x00\x00\x00\x14ftyM4A" => :app_lossless_audio_codec,
|
66
|
+
"\x00\x01\x00\x00MYISAM DATABASE" => :msisam_database, # e.g. Microsoft Money
|
67
|
+
"\x00\x01\x00\x00Standard ACE DB" => :microsoft_access_ace_db,
|
68
|
+
"\x00\x01\x00\x00Standard Jet DB" => :microsoft_access_jet_db,
|
69
|
+
"\x00\x01BA" => :palm_address_book,
|
70
|
+
"\x00\x01BD" => :palm_date_book,
|
71
|
+
"\x01\x0F\x00\x00" => :microsoft_sql_server_2000,
|
72
|
+
"(This file must be converted with BinHex" => :binhex,
|
73
|
+
"*** Installation Started" => :symantec_wise_installer_log_file,
|
74
|
+
".REC" => :realplayer_video,
|
75
|
+
".RMF" => :realplayer_media,
|
76
|
+
"01ORDNANCE SURVEY" => :national_transfer_format_map,
|
77
|
+
"\x31\xBE" => :microsoft_write,
|
78
|
+
"\x32\xBE" => :microsoft_write,
|
79
|
+
"4" + ['CDB2A1'].pack('H*') => :tcpdump,
|
80
|
+
":VERSION" => :surfplan_kite_project,
|
81
|
+
"AC10" => :autocad,
|
82
|
+
".snd" => :sun_microsystems_law_audio_file,
|
83
|
+
"\x23\x21" => :shebang,
|
84
|
+
"%!" => :postscript
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
it "solves the magic number type" do
|
89
|
+
SAMPLE_STRING_TO_MAGIC_NUMBER_TYPE.each_pair{|string, type|
|
90
|
+
string.magic_number_type.must_equal type, "Trying #{string} => #{type}"
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
metadata
CHANGED
@@ -1,88 +1,112 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sixarm_ruby_magic_number_type
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
4
5
|
prerelease:
|
5
|
-
version: 1.0.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- SixArm
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
|
-
cert_chain:
|
12
|
-
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
11
|
+
cert_chain:
|
12
|
+
- !binary |-
|
13
|
+
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCRENDQW0yZ0F3SUJB
|
14
|
+
Z0lKQUtQd0VFVFU1YkhvTUEwR0NTcUdTSWIzRFFFQkJRVUFNR0F4Q3pBSkJn
|
15
|
+
TlYKQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZB
|
16
|
+
WURWUVFIRXcxVFlXNGdSbkpoYm1OcApjMk52TVE4d0RRWURWUVFLRXdaVGFY
|
17
|
+
aEJjbTB4RXpBUkJnTlZCQU1UQ25OcGVHRnliUzVqYjIwd0hoY05NVEF4Ck1q
|
18
|
+
RXpNak15TnpFeldoY05NVE13T1RBNE1qTXlOekV6V2pCZ01Rc3dDUVlEVlFR
|
19
|
+
R0V3SlZVekVUTUJFR0ExVUUKQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFV
|
20
|
+
RUJ4TU5VMkZ1SUVaeVlXNWphWE5qYnpFUE1BMEdBMVVFQ2hNRwpVMmw0UVhK
|
21
|
+
dE1STXdFUVlEVlFRREV3cHphWGhoY20wdVkyOXRNSUdmTUEwR0NTcUdTSWIz
|
22
|
+
RFFFQkFRVUFBNEdOCkFEQ0JpUUtCZ1FDOTRtRDlKRHdCc3Vuc09JMFZSM0NY
|
23
|
+
WGJPV2c5Y1dhV2Npd0Z5Sk5GaU03QTlJOEtQTGZYVXcKUUM0Y3pVZTVadUc0
|
24
|
+
V0h2aW5yV2hrckNLKzFkV0Jxb0VDbHhkRi9Gb0tPNWErdG9uR0Nqam1meTgx
|
25
|
+
Sm1Gamp5eAplVHNqc0h5dncrUWlrOWtwZjlhajYrcG5rTnJWc3dnTkhWZWEy
|
26
|
+
bzl5YWJiRWlTNlZTZUpXb1FJREFRQUJvNEhGCk1JSENNQjBHQTFVZERnUVdC
|
27
|
+
QlF6UEp0cW1TZ2M1M2VETjdhU3pEUXdyOVRBTERDQmtnWURWUjBqQklHS01J
|
28
|
+
R0gKZ0JRelBKdHFtU2djNTNlRE43YVN6RFF3cjlUQUxLRmtwR0l3WURFTE1B
|
29
|
+
a0dBMVVFQmhNQ1ZWTXhFekFSQmdOVgpCQWdUQ2tOaGJHbG1iM0p1YVdFeEZq
|
30
|
+
QVVCZ05WQkFjVERWTmhiaUJHY21GdVkybHpZMjh4RHpBTkJnTlZCQW9UCkJs
|
31
|
+
TnBlRUZ5YlRFVE1CRUdBMVVFQXhNS2MybDRZWEp0TG1OdmJZSUpBS1B3RUVU
|
32
|
+
VTViSG9NQXdHQTFVZEV3UUYKTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFB
|
33
|
+
RGdZRUFvb0VleFAvb1BhbTFUUDcxU3l1aHhNYit1VHJaYlNRZQpqVkIrRXhS
|
34
|
+
d1dhZEd3YU5QVUE1NmQzOXF3YXZ3UCtpdSszSnBlb25OTVZ2YldYRjVuYUNY
|
35
|
+
L2RORkllUkVIekVSClpEUlFZTXFydTlURU1uYTZIRDl6cGNzdEY3dndUaEdv
|
36
|
+
dmxPUSszWTZwbFE0bk16aXBYY1o5VEhxczY1UElMMHEKZWFid3BDYkFvcG89
|
37
|
+
Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
|
38
|
+
date: 2012-09-07 00:00:00.000000000 Z
|
35
39
|
dependencies: []
|
36
|
-
|
37
40
|
description:
|
38
41
|
email: sixarm@sixarm.com
|
39
42
|
executables: []
|
40
|
-
|
41
43
|
extensions: []
|
42
|
-
|
43
44
|
extra_rdoc_files: []
|
44
|
-
|
45
|
-
|
46
|
-
-
|
47
|
-
-
|
45
|
+
files:
|
46
|
+
- .gemtest
|
47
|
+
- Rakefile
|
48
|
+
- README.md
|
49
|
+
- VERSION
|
48
50
|
- lib/sixarm_ruby_magic_number_type.rb
|
49
|
-
-
|
50
|
-
-
|
51
|
-
-
|
52
|
-
- test/
|
53
|
-
- test/
|
54
|
-
- test/
|
55
|
-
- test/
|
56
|
-
- test/
|
57
|
-
- test/
|
58
|
-
- test/
|
59
|
-
|
51
|
+
- lib/sixarm_ruby_magic_number_type/file.rb
|
52
|
+
- lib/sixarm_ruby_magic_number_type/io.rb
|
53
|
+
- lib/sixarm_ruby_magic_number_type/string.rb
|
54
|
+
- test/sixarm_ruby_magic_number_type_test.rb
|
55
|
+
- test/sixarm_ruby_magic_number_type_test/file_test.rb
|
56
|
+
- test/sixarm_ruby_magic_number_type_test/io_test.rb
|
57
|
+
- test/sixarm_ruby_magic_number_type_test/string_test.rb
|
58
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.html
|
59
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.xml
|
60
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.fit
|
61
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.gif
|
62
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.jpg
|
63
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.png
|
64
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.ps
|
65
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.ras
|
66
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.sgi
|
67
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.tiff
|
68
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.bz2
|
69
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.gz
|
60
70
|
homepage: http://sixarm.com/
|
61
71
|
licenses: []
|
62
|
-
|
63
72
|
post_install_message:
|
64
73
|
rdoc_options: []
|
65
|
-
|
66
|
-
require_paths:
|
74
|
+
require_paths:
|
67
75
|
- lib
|
68
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
77
|
none: false
|
70
|
-
requirements:
|
71
|
-
- -
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version:
|
74
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
83
|
none: false
|
76
|
-
requirements:
|
77
|
-
- -
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version:
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
80
88
|
requirements: []
|
81
|
-
|
82
89
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.
|
90
|
+
rubygems_version: 1.8.23
|
84
91
|
signing_key:
|
85
92
|
specification_version: 3
|
86
|
-
summary:
|
87
|
-
|
88
|
-
|
93
|
+
summary: SixArm.com » Ruby » Magic number type inspects bytes to decide on a mime
|
94
|
+
type
|
95
|
+
test_files:
|
96
|
+
- test/sixarm_ruby_magic_number_type_test.rb
|
97
|
+
- test/sixarm_ruby_magic_number_type_test/file_test.rb
|
98
|
+
- test/sixarm_ruby_magic_number_type_test/io_test.rb
|
99
|
+
- test/sixarm_ruby_magic_number_type_test/string_test.rb
|
100
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.html
|
101
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.xml
|
102
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.fit
|
103
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.gif
|
104
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.jpg
|
105
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.png
|
106
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.ps
|
107
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.ras
|
108
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.sgi
|
109
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.tiff
|
110
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.bz2
|
111
|
+
- test/sixarm_ruby_magic_number_type_test/samples/sample.gz
|
112
|
+
has_rdoc: true
|
metadata.gz.sig
CHANGED
Binary file
|
data/LICENSE.txt
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
LICENSE
|
2
|
-
|
3
|
-
You may choose any of these licenses:
|
4
|
-
|
5
|
-
- CreativeCommons License, Non-commercial Share Alike
|
6
|
-
- LGPL, GNU Lesser General Public License
|
7
|
-
- MIT License
|
8
|
-
- Ruby License
|
9
|
-
|
10
|
-
THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
11
|
-
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
12
|
-
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
data/README.rdoc
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
|
2
|
-
= SixArm.com » Ruby » MagicNumberType
|
3
|
-
|
4
|
-
Author:: Joel Parker Henderson, joelparkerhenderson@gmail.com
|
5
|
-
Copyright:: Copyright (c) 2010 Joel Parker Henderson
|
6
|
-
License:: See LICENSE.txt file
|
7
|
-
|
8
|
-
MagicNumberType infers the mime type of data from the leading bits.
|
9
|
-
|
10
|
-
It infers based on widespread programming conventions for data file formats.
|
11
|
-
|
12
|
-
Magic numbers are the first bits of a file or data stream
|
13
|
-
which uniquely identify the type of file or data stream.
|
14
|
-
|
15
|
-
For example when the first bits are "BM",
|
16
|
-
this identifies the file as a bitmap image file.
|
17
|
-
|
18
|
-
These magic numbers are by convention and we are using this guide:
|
19
|
-
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
|
20
|
-
|
21
|
-
Typical uses of magic numbers:
|
22
|
-
- to quickly identify a file's data type
|
23
|
-
- to check if data matches the file's MIME type or extension
|
24
|
-
- to check if a web form file upload matches its HTTP content type
|
25
|
-
|
26
|
-
Compare:
|
27
|
-
- MIME::Types ruby library
|
28
|
-
- Unix magic() command for testing files on disk
|
29
|
-
- http://shared-mime.rubyforge.org/
|
30
|
-
|
Binary file
|
Binary file
|