| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| const int initialMagicNumbersMaxLength = 12; | |
| class MagicNumber { | |
| final String mimeType; | |
| final String numbers; | |
| final String? masks; | |
| const MagicNumber(this.mimeType, this.numbers, [this.masks]); | |
| bool matches(List<int> header) { | |
| if (header.length < numbers.length) return false; | |
| for (var i = 0; i < numbers.length; i++) { | |
| final number = numbers.codeUnitAt(i); | |
| if (masks != null) { | |
| final mask = masks!.codeUnitAt(i); | |
| if ((mask & number) != (mask & header[i])) return false; | |
| } else { | |
| if (number != header[i]) return false; | |
| } | |
| } | |
| return true; | |
| } | |
| } | |
| const List<MagicNumber> initialMagicNumbers = [ | |
| MagicNumber('application/pdf', '\x25\x50\x44\x46'), | |
| MagicNumber('application/postscript', '\x25\x51'), | |
| /// AIFF is based on the EA IFF 85 Standard for Interchange Format Files. | |
| /// -> 4 bytes have the ASCII characters 'F' 'O' 'R' 'M'. | |
| /// -> 4 bytes indicating the size of the file | |
| /// -> 4 bytes have the ASCII characters 'A' 'I' 'F' 'F'. | |
| /// http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/Docs/AIFF-1.3.pdf | |
| MagicNumber( | |
| 'audio/x-aiff', | |
| '\x46\x4F\x52\x4D\x00\x00\x00\x00\x41\x49\x46\x46', | |
| '\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF', | |
| ), | |
| /// -> 4 bytes have the ASCII characters 'f' 'L' 'a' 'C'. | |
| /// https://xiph.org/flac/format.html | |
| MagicNumber('audio/x-flac', '\x66\x4C\x61\x43'), | |
| /// The WAVE file format is based on the RIFF document format. | |
| /// -> 4 bytes have the ASCII characters 'R' 'I' 'F' 'F'. | |
| /// -> 4 bytes indicating the size of the file | |
| /// -> 4 bytes have the ASCII characters 'W' 'A' 'V' 'E'. | |
| /// http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/riffmci.pdf | |
| MagicNumber( | |
| 'audio/x-wav', | |
| '\x52\x49\x46\x46\x00\x00\x00\x00\x57\x41\x56\x45', | |
| '\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF', | |
| ), | |
| MagicNumber('image/gif', '\x47\x49\x46\x38\x37\x61'), | |
| MagicNumber('image/gif', '\x47\x49\x46\x38\x39\x61'), | |
| MagicNumber('image/jpeg', '\xFF\xD8'), | |
| MagicNumber('image/png', '\x89\x50\x4E\x47\x0D\x0A\x1A\x0A'), | |
| MagicNumber('image/tiff', '\x49\x49\x2A\x00'), | |
| MagicNumber('image/tiff', '\x4D\x4D\x00\x2A'), | |
| MagicNumber('audio/aac', '\xFF\xF1'), | |
| MagicNumber('audio/aac', '\xFF\xF9'), | |
| MagicNumber('audio/weba', '\x1A\x45\xDF\xA3'), | |
| MagicNumber('audio/mpeg', '\x49\x44\x33'), | |
| MagicNumber('audio/mpeg', '\xFF\xFB'), | |
| MagicNumber('audio/ogg', '\x4F\x70\x75'), | |
| MagicNumber( | |
| 'video/3gpp', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x33\x67\x70\x35', | |
| '\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| MagicNumber( | |
| 'video/mp4', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x61\x76\x63\x31', | |
| '\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| MagicNumber( | |
| 'video/mp4', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x69\x73\x6F\x32', | |
| '\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| MagicNumber( | |
| 'video/mp4', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x69\x73\x6F\x6D', | |
| '\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| MagicNumber( | |
| 'video/mp4', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x6D\x70\x34\x31', | |
| '\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| MagicNumber( | |
| 'video/mp4', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x6D\x70\x34\x32', | |
| '\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| MagicNumber('model/gltf-binary', '\x46\x54\x6C\x67'), | |
| /// The WebP file format is based on the RIFF document format. | |
| /// -> 4 bytes have the ASCII characters 'R' 'I' 'F' 'F'. | |
| /// -> 4 bytes indicating the size of the file | |
| /// -> 4 bytes have the ASCII characters 'W' 'E' 'B' 'P'. | |
| /// https://developers.google.com/speed/webp/docs/riff_container | |
| MagicNumber( | |
| 'image/webp', | |
| '\x52\x49\x46\x46\x00\x00\x00\x00\x57\x45\x42\x50', | |
| '\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF', | |
| ), | |
| MagicNumber('font/woff2', '\x77\x4f\x46\x32'), | |
| /// High Efficiency Image File Format (ISO/IEC 23008-12). | |
| /// -> 4 bytes indicating the ftyp box length. | |
| /// -> 4 bytes have the ASCII characters 'f' 't' 'y' 'p'. | |
| /// -> 4 bytes have the ASCII characters 'h' 'e' 'i' 'c'. | |
| /// https://www.iana.org/assignments/media-types/image/heic | |
| MagicNumber( | |
| 'image/heic', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x68\x65\x69\x63', | |
| '\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| /// -> 4 bytes indicating the ftyp box length. | |
| /// -> 4 bytes have the ASCII characters 'f' 't' 'y' 'p'. | |
| /// -> 4 bytes have the ASCII characters 'h' 'e' 'i' 'x'. | |
| MagicNumber( | |
| 'image/heic', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x68\x65\x69\x78', | |
| '\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| /// -> 4 bytes indicating the ftyp box length. | |
| /// -> 4 bytes have the ASCII characters 'f' 't' 'y' 'p'. | |
| /// -> 4 bytes have the ASCII characters 'm' 'i' 'f' '1'. | |
| MagicNumber( | |
| 'image/heif', | |
| '\x00\x00\x00\x00\x66\x74\x79\x70\x6D\x69\x66\x31', | |
| '\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF', | |
| ), | |
| ]; |