1f72f8299SJan Lentfer 2327e51cbSPeter Avalos#------------------------------------------------------------------------------ 3*3b9cdfa3SAntonio Huete Jimenez# $File: mathematica,v 1.14 2021/11/07 16:27:36 christos Exp $ 4327e51cbSPeter Avalos# mathematica: file(1) magic for mathematica files 5327e51cbSPeter Avalos# "H. Nanosecond" <aldomel@ix.netcom.com> 6327e51cbSPeter Avalos# Mathematica a multi-purpose math program 7327e51cbSPeter Avalos# versions 2.2 and 3.0 8327e51cbSPeter Avalos 9327e51cbSPeter Avalos#mathematica .mb 10327e51cbSPeter Avalos0 string \064\024\012\000\035\000\000\000 Mathematica version 2 notebook 11c30bd091SSascha Wildner!:ext mb 12327e51cbSPeter Avalos0 string \064\024\011\000\035\000\000\000 Mathematica version 2 notebook 13c30bd091SSascha Wildner!:ext mb 14327e51cbSPeter Avalos 15327e51cbSPeter Avalos# .ma 16970935fdSSascha Wildner# multiple possibilities: 17327e51cbSPeter Avalos 18327e51cbSPeter Avalos0 string (*^\n\n::[\011frontEndVersion\ =\ Mathematica notebook 19327e51cbSPeter Avalos#>41 string >\0 %s 20c30bd091SSascha Wildner!:ext mb 21327e51cbSPeter Avalos 22327e51cbSPeter Avalos#0 string (*^\n\n::[\011palette Mathematica notebook version 2.x 23327e51cbSPeter Avalos 24327e51cbSPeter Avalos#0 string (*^\n\n::[\011Information Mathematica notebook version 2.x 25327e51cbSPeter Avalos#>675 string >\0 %s #doesn't work well 26327e51cbSPeter Avalos 27970935fdSSascha Wildner# there may be 'cr' instead of 'nl' in some does this matter? 28327e51cbSPeter Avalos 29327e51cbSPeter Avalos# generic: 30327e51cbSPeter Avalos0 string (*^\r\r::[\011 Mathematica notebook version 2.x 31c30bd091SSascha Wildner!:ext mb 32327e51cbSPeter Avalos0 string (*^\r\n\r\n::[\011 Mathematica notebook version 2.x 33c30bd091SSascha Wildner!:ext mb 34327e51cbSPeter Avalos0 string (*^\015 Mathematica notebook version 2.x 35c30bd091SSascha Wildner!:ext mb 36327e51cbSPeter Avalos0 string (*^\n\r\n\r::[\011 Mathematica notebook version 2.x 37c30bd091SSascha Wildner!:ext mb 38327e51cbSPeter Avalos0 string (*^\r::[\011 Mathematica notebook version 2.x 39c30bd091SSascha Wildner!:ext mb 40327e51cbSPeter Avalos0 string (*^\r\n::[\011 Mathematica notebook version 2.x 41c30bd091SSascha Wildner!:ext mb 42327e51cbSPeter Avalos0 string (*^\n\n::[\011 Mathematica notebook version 2.x 43c30bd091SSascha Wildner!:ext mb 44327e51cbSPeter Avalos0 string (*^\n::[\011 Mathematica notebook version 2.x 45c30bd091SSascha Wildner!:ext mb 46327e51cbSPeter Avalos 47327e51cbSPeter Avalos 48327e51cbSPeter Avalos# Mathematica .mx files 49327e51cbSPeter Avalos 50327e51cbSPeter Avalos#0 string (*This\ is\ a\ Mathematica\ binary\ dump\ file.\ It\ can\ be\ loaded\ with\ Get.*) Mathematica binary file 51327e51cbSPeter Avalos0 string (*This\ is\ a\ Mathematica\ binary\ Mathematica binary file 52327e51cbSPeter Avalos#>71 string \000\010\010\010\010\000\000\000\000\000\000\010\100\010\000\000\000 53327e51cbSPeter Avalos# >71... is optional 54327e51cbSPeter Avalos>88 string >\0 from %s 55327e51cbSPeter Avalos 56327e51cbSPeter Avalos 57327e51cbSPeter Avalos# Mathematica files PBF: 58327e51cbSPeter Avalos# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000 59327e51cbSPeter Avalos0 string MMAPBF\000\001\000\000\000\203\000\001\000 Mathematica PBF (fonts I think) 60327e51cbSPeter Avalos 61327e51cbSPeter Avalos# .ml files These are menu resources I think 62327e51cbSPeter Avalos# these start with "[0-9][0-9][0-9]\ A~[0-9][0-9][0-9]\ 63327e51cbSPeter Avalos# how to put that into a magic rule? 64327e51cbSPeter Avalos4 string \ A~ MAthematica .ml file 65327e51cbSPeter Avalos 66327e51cbSPeter Avalos# .nb files 67327e51cbSPeter Avalos#too long 0 string (***********************************************************************\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Mathematica-Compatible Notebook Mathematica 3.0 notebook 68327e51cbSPeter Avalos0 string (*********************** Mathematica 3.0 notebook 69327e51cbSPeter Avalos 70327e51cbSPeter Avalos# other (* matches it is a comment start in these langs 7179343712SPeter Avalos# GRR: Too weak; also matches other languages e.g. ML 7279343712SPeter Avalos#0 string (* Mathematica, or Pascal, Modula-2 or 3 code text 73327e51cbSPeter Avalos 74327e51cbSPeter Avalos######################### 75327e51cbSPeter Avalos# MatLab v5 76614728caSSascha Wildner# URL: http://fileformats.archiveteam.org/wiki/MAT 77614728caSSascha Wildner# Reference: https://www.mathworks.com/help/pdf_doc/matlab/matfile_format.pdf 78614728caSSascha Wildner# first 116 bytes of header contain text in human-readable form 79614728caSSascha Wildner0 string MATLAB Matlab v 80614728caSSascha Wildner#>11 string/T x \b, at 11 "%.105s" 81614728caSSascha Wildner#!:mime application/octet-stream 82614728caSSascha Wildner!:mime application/x-matlab-data 83614728caSSascha Wildner!:ext mat 84614728caSSascha Wildner# https://de.mathworks.com/help/matlab/import_export/mat-file-versions.html 85614728caSSascha Wildner# level of the MAT-file like: 5.0 7.0 or maybe 7.3 86614728caSSascha Wildner#>7 string x LEVEL "%.3s" 87614728caSSascha Wildner>7 ubyte =0x35 \b5 mat-file 88614728caSSascha Wildner>7 ubyte !0x35 89614728caSSascha Wildner>>7 string x \b%.3s mat-file 90327e51cbSPeter Avalos>126 short 0x494d (big endian) 91614728caSSascha Wildner>>124 beshort x version %#04x 92327e51cbSPeter Avalos>126 short 0x4d49 (little endian) 93614728caSSascha Wildner# 0x0100 for level 5.0 and 0x0200 for level 7.0 94614728caSSascha Wildner>>124 leshort x version %#04x 95614728caSSascha Wildner# test again so that default clause works 96614728caSSascha Wildner>126 short x 97614728caSSascha Wildner# created by MATLAB include Platform sometimes without leading comma (0x2C) or missing 98614728caSSascha Wildner# like: GLNX86 PCWIN PCWIN64 SOL2 Windows\0407 nt posix 99614728caSSascha Wildner>>20 search/2 Platform:\040 \b, platform 100614728caSSascha Wildner>>>&0 string x %-0.2s 101614728caSSascha Wildner>>>&2 ubyte !0x2C \b%c 102614728caSSascha Wildner>>>>&0 ubyte !0x2C \b%c 103614728caSSascha Wildner>>>>>&0 ubyte !0x2C \b%c 104614728caSSascha Wildner>>>>>>&0 ubyte !0x2C \b%c 105614728caSSascha Wildner>>>>>>>&0 ubyte !0x2C \b%c 106614728caSSascha Wildner>>>>>>>>&0 ubyte !0x2C \b%c 107614728caSSascha Wildner>>>>>>>>>&0 ubyte !0x2C \b%c 108614728caSSascha Wildner# examples without Platform tag like one_by_zero_char.mat 109614728caSSascha Wildner>>20 default x 110614728caSSascha Wildner>>>11 string x "%s" 111614728caSSascha Wildner# created by MATLAB include time like: Fri Feb 20 15:26:59 2009 112614728caSSascha Wildner>34 search/9/c created\040on:\040 \b, created 113614728caSSascha Wildner>>&0 string x %-.24s 114614728caSSascha Wildner# MatLab v4 115614728caSSascha Wildner# From: Joerg Jenderek 116614728caSSascha Wildner# check for valid imaginary flag of Matlab matrix version 4 117614728caSSascha Wildner13 ushort 0 118614728caSSascha Wildner# check for valid ASCII matrix name 119614728caSSascha Wildner>20 ubyte >0x1F 120*3b9cdfa3SAntonio Huete Jimenez# skip PreviousEntries.dat with "invalid high" name \304P\344@\001 121*3b9cdfa3SAntonio Huete Jimenez>>20 ubyte <0304 122*3b9cdfa3SAntonio Huete Jimenez# skip some Netwfw*.dat and $I3KREPH.dat by checking for non zero number of rows 123*3b9cdfa3SAntonio Huete Jimenez>>>4 ulong !0 124614728caSSascha Wildner# skip some CD-ROM filesystem like test-hfs.iso by looking for valid big endian type flag 125*3b9cdfa3SAntonio Huete Jimenez>>>>0 ubelong&0xFFffFF00 0x00000300 126*3b9cdfa3SAntonio Huete Jimenez>>>>>0 use matlab4 127614728caSSascha Wildner# no example for 8-bit and 16-bit integers matrix 128*3b9cdfa3SAntonio Huete Jimenez>>>>0 ubelong&0xFFffFF00 0x00000400 129*3b9cdfa3SAntonio Huete Jimenez>>>>>0 use matlab4 130*3b9cdfa3SAntonio Huete Jimenez# branch for Little-Endian variant of Matlab MATrix version 4 131614728caSSascha Wildner# skip big endian variant by looking for valid low lttle endian type flag 132*3b9cdfa3SAntonio Huete Jimenez>>>>0 ulelong <53 133*3b9cdfa3SAntonio Huete Jimenez# skip tokens.dat and some Netwfw*.dat by check for valid imaginary flag value of MAT version 4 134*3b9cdfa3SAntonio Huete Jimenez>>>>>12 ulelong <2 135*3b9cdfa3SAntonio Huete Jimenez# no misidentfied little endian MATrix example with "short" matrix name 136*3b9cdfa3SAntonio Huete Jimenez>>>>>>16 ulelong <3 137*3b9cdfa3SAntonio Huete Jimenez>>>>>>>0 use \^matlab4 138*3b9cdfa3SAntonio Huete Jimenez# little endian MATrix with "long" matrix name or some misidentified samples 139*3b9cdfa3SAntonio Huete Jimenez>>>>>>16 ulelong >2 140*3b9cdfa3SAntonio Huete Jimenez# skip TileCacheLogo-*.dat with invalid 2nd character \001 of matrix name with length 96 141*3b9cdfa3SAntonio Huete Jimenez>>>>>>>21 ubyte >0x1F 142*3b9cdfa3SAntonio Huete Jimenez>>>>>>>>0 use \^matlab4 143614728caSSascha Wildner# display information of Matlab v4 mat-file 144614728caSSascha Wildner0 name matlab4 Matlab v4 mat-file 145614728caSSascha Wildner#!:mime application/octet-stream 146614728caSSascha Wildner!:mime application/x-matlab-data 147614728caSSascha Wildner!:ext mat 148614728caSSascha Wildner# 20-byte header with 5 long integers that contains information describing certain attributes of the Matrix 149614728caSSascha Wildner# type flag decimal MOPT; maximal 4052=FD4h; maximal 52=34h for little endian 150614728caSSascha Wildner#>0 ubelong x \b, type flag %u 151614728caSSascha Wildner#>0 ubelong x (%#x) 152614728caSSascha Wildner# M: 0~little endian 1~Big Endian 2~VAX D-float 3~VAX G-float 4~Cray 153614728caSSascha Wildner#>0 ubelong/1000 x \b, M=%u 154614728caSSascha Wildner>0 ubelong/1000 0 (little endian) 155614728caSSascha Wildner>0 ubelong/1000 1 (big endian) 156614728caSSascha Wildner>0 ubelong/1000 2 (VAX D-float) 157614728caSSascha Wildner>0 ubelong/1000 3 (VAX G-float) 158614728caSSascha Wildner>0 ubelong/1000 4 (Cray) 159614728caSSascha Wildner# namlen; the length of the matrix name 160614728caSSascha Wildner#>16 ubelong x \b, name length %u 161*3b9cdfa3SAntonio Huete Jimenez#>(16.L+19) ubyte x \b, TERMINATING NAME CHARACTER=%#x 162614728caSSascha Wildner# nul terminated matrix name like: fit_params testmatrix testsparsecomplex teststringarray 163614728caSSascha Wildner#>20 string x \b, MATRIX NAME="%s" 164*3b9cdfa3SAntonio Huete Jimenez#>21 ubyte x \b, MAYBE 2ND CHAR=%c 165614728caSSascha Wildner>16 pstring/L x %s 166614728caSSascha Wildner# T indicates the matrix type: 0~numeric 1~text 2~sparse 167614728caSSascha Wildner#>0 ubelong%10 x \b, T=%u 168614728caSSascha Wildner>0 ubelong%10 0 \b, numeric 169614728caSSascha Wildner>0 ubelong%10 1 \b, text 170614728caSSascha Wildner>0 ubelong%10 2 \b, sparse 171614728caSSascha Wildner# mrows; number of rows in the matrix like: 1 3 8 172614728caSSascha Wildner>4 ubelong x \b, rows %u 173614728caSSascha Wildner# ncols; number of columns in the matrix like: 1 3 4 5 9 43 174614728caSSascha Wildner>8 ubelong x \b, columns %u 175614728caSSascha Wildner# imagf; imaginary flag; 1~matrix has an imaginary part 0~only real data 176*3b9cdfa3SAntonio Huete Jimenez>12 ubelong !0 \b, imaginary (%u) 177614728caSSascha Wildner# real; Real part of the matrix consists of mrows * ncols numbers 178