[nmglug] magic number

Jason Davis mohadib at openactive.org
Sat Aug 6 21:09:18 PDT 2005


Hello,
So I'm writing an app that uses a files magic number to 
know if it is a MP3. I got it working mostly , however , I think I 
might be confused.

So say I have a Riff-Wave-Mp3 file..

this would be

0       string          RIFF            RIFF (little-endian) data
>8      string          WAVE            \b, WAVE audio
>>20    leshort         85              \b, MPEG Layer 3

exmple:
mohadib at dune:~/music$ file G.\ Love\ \&\ Special\ Sauce/G\ Love\ and\
the\ Special\ Sauce\ -\ Cold\ Beverage.mp3
G. Love & Special Sauce/G Love and the Special Sauce - Cold
Beverage.mp3: RIFF (little-endian) data, WAVE audio, MPEG Layer 3,
stereo 44100 Hz


so , in the above example should the 28th  and 29th byte 
be a short that equals 85?


java test case:

RandomAccessFile raf = new RandomAccessFile(new File(paths[i]) , "r");
byte[] magic = new byte[4];
raf.read(magic);

/* test for string RIFF - 4 bytes starting from 0 */
if(new String(magic , 0 , 4).equals("RIFF")){  //true
  raf.seek(8);  // >8 from 0 is 8 :)

  /* look for string WAVE */
  byte[] shortByte = new byte[4];
  raf.read(shortByte);
  if(new String(shortByte , 0 , 4).equals("WAVE")){ //true
                
    raf.seek(28); // >>20 from 8 , go to byte 28?
    byte[] sb = new byte[2];
    raf.read(sb);
    short[] sa = toShortArray2(sb);

    if(sa[0] == 0x55) System.out.println("GOT MP3"); //false   
    else if(sa[0] == 85) System.out.println("GOT MP3"); //false

}


public static short[] toShortArray2(byte []b) {
  final short[] ret = new short[b.length/2];
  ByteBuffer.wrap(b).asShortBuffer().get(ret);
  return ret;
}



Thanks for looking,
jd






-- 
long l = Long.valueOf(new String(new byte[] {'1' , '2' , '3' ,
'4'})).longValue();





More information about the nmglug mailing list