Java Programming Home Page: Archive: Message #68

Date: Apr 13 2000 12:08:56 EDT
From: "Java Programming" <javaProgramming-owner@listbot.com>
Subject: Identifying the stream type

In Java, input streams can come from
anywhere. They are an unformatted sequence of bytes.
The tricky bit is to identify where the stream is
comming from. Here is a bit of code that can help....

package gui;
import java.io.*;
import java.util.*;
public class StreamSniffer {
	private BufferedInputStream bis;
	private byte header[] = new byte[6];
	private int numberActuallyRead = 0;
	
	public StreamSniffer(InputStream is) {
		bis = new BufferedInputStream(is);
		init();
		sniff();
	}
	
	public BufferedInputStream getStream() {
		return bis;
	}
	
	// Sniff and cover your tracks!
	private void sniff() {
		if (! bis.markSupported()) {
			System.out.println(
				"StreamSniffer needs"+
				" a markable stream");
			return;
		}
		bis.mark(header.length);
		
		try {
			numberActuallyRead 
				= bis.read(header);
			bis.reset();
		}
		catch (IOException e) {
			System.out.println(e);
			numberActuallyRead = -1;
		}
		
	}
	public void printHeader() {
		System.out.println("In hex...");
		for (int i=0; i < header.length; i++) 
		 Byte.printToHex(header[i]);	
		System.out.println("\nin base 8...");
		for (int i=0; i < header.length; i++) 
		 Byte.printToOctal(header[i]);
		System.out.println("\n in ASCII");
		System.out.println(new String(header));
		System.out.println("if (match("
			+ Byte.toString(header[0]) +","
			+ Byte.toString(header[1]) +","
			+ Byte.toString(header[2]) +","
			+ Byte.toString(header[3]) +"))");	
		 
	}
	
	public String toString() {
		int id = classifyStream();
		String s = getStringForId(id);
		if (id == TYPENOTFOUND)
			printHeader();		
		return s;
			
	}
	
	public boolean match(
		char c0, char c1) {
		byte b[] = header;
		return
			(b[0] == c0) &&
			(b[1] == c1);
	}
	public boolean match(
		char c0, char c1, 
		char c2, char c3) {
		byte b[] = header;
		return 
			(b[0] == (c0&0xFF)) &&
			(b[1] == (c1&0xFF)) &&
			(b[2] == (c2&0xFF)) &&
			(b[3] == (c3&0xFF));		
	}
	public boolean match(
		int c0, int c1, 
		int c2, int c3) {
		byte b[] = header;
		return 
			((b[0]&0xFF) == (c0&0xFF)) &&
			((b[1]&0xFF) == (c1&0xFF)) &&
			((b[2]&0xFF) == (c2&0xFF)) &&
			((b[3]&0xFF) == (c3&0xFF));		
	}
	public boolean match(
		int c0, int c1) {
		byte b[] = header;
		return 
			((b[0]&0xFF) == (c0&0xFF)) &&
			((b[1]&0xFF) == (c1&0xFF));		
	}
	

	
	
	public int classifyStream() {
		byte b[] = header;
		String s = new String(b);
		short leshort = 
			(short)(
				(b[0] << 8)|(b[1]));
		int belong =  
			(b[0] << 24) |
			(b[1] << 16) |
			(b[2] << 8) |
			(b[3]);
					

		if (s.startsWith("begin"))
			return UUENCODED;
		if (s.startsWith ("xbtoa"))
			return BTOAD;
		if (s.startsWith ("P1"))
			return PBM;
		if (s.startsWith ("P2"))
			return PGM;
		if (s.startsWith ("P3"))
			return PPM;
		if (s.startsWith ("P4"))
			return PBM_RAWBITS;
		if (s.startsWith ("P5"))
			return PGM_RAWBITS;
		if (s.startsWith ("P6"))
			return PPM_RAWBITS;
		if (s.startsWith ("yz"))
			return MGR_BITMAP;
		if (s.startsWith ("ILBM"))
			return IFF_ILBM;
		if ((b[0] == 131) &&
			(b[1] == 246) &&
			(b[2] == 152) &&
			(b[3] == 225))
			return SUNRASTER;
		if ((b[0] == 1) &&
			(b[1] == 332) ) 
			return SGI_IMAGE;
		if ((b[0] == 361) &&
			(b[1] == 0) &&
			(b[2] == 100) &&
			(b[3] == 273 ))
			return CMU_WINDOW_MANAGER_BITMAP;
		if ((b[0] == 131) &&
			(b[1] == 246) &&
			(b[2] == 152) &&
			(b[3] == 225) )
			return SUN;
		if ((b[0] == 115) &&
			(b[1] == 115))
			return TIFF_BIG_ENDIAN;
		if ((b[0] == 111) &&
			(b[1] == 111) )
			return TIFF_LITTLE_ENDIAN;
		if (match(73,73,42,0))
			return TIFF_LITTLE_ENDIAN;
		if (s.startsWith("GIF87a"))
			return GIF87a;
		if (s.startsWith("GIF89a"))
			return GIF89a;
		if ((b[0] == 131) &&
			(b[1] == 246) &&
			(b[2] == 152) &&
			(b[3] == 225))
			return SUNRASTER;
		if (leshort == 0xAF11)
			return FLI;
		if ((b[0] == 0) &&
			(b[1] == 0) &&
			(b[2] == 1) &&
			(b[3] == 263))
			return MPEG;
		if (s.startsWith(".snd")) 
			return SUN_NEXT_AUDIO;
		if (s.startsWith("MThd")) 
			return STANDARD_MIDI;
		if (s.startsWith("RIFF")) 
			return MICROSOFT_RIFF;
		if (s.startsWith("BZ")) 
			return BZIP;
		if (s.startsWith("FORM")) 
			return IFF_DATA;
		if (s.startsWith("IIN1")) 
			return NIFF_IMAGE;
		if (s.startsWith("BM")) 
			return PC_BITMAP;
		if (s.startsWith("%PDF-")) 
			return PDF_DOCUMENT;
		if (s.startsWith("%!")) 
			return POSTSCRIPT_DOCUMENT;
		if (s.startsWith("MOVI")) 
			return SILICON_GRAPHICS_MOVIE;
		if (s.startsWith("moov")) 
			return APPLE_QUICKTIME_MOVIE;
		if (s.startsWith("mdat")) 
			return APPLE_QUICKTIME_MOVIE;
		if (match('P','K')) 
			return ZIP_ARCHIVE;
		if (match(03,0235)) 
			return UNIX_COMPRESS;
		if (match(037,0213)) 
			return GZIP;
		if (match(037,036)) 
			return HUFFMAN;
		if (match((char)0x89,'P','N','G')) 
			return PNG_IMAGE;
		if (match(0xFF, 0xD8, 0xFF, 0xE0)) 
			return JPEG;
		if (match(0377,0330,0377,0356)) 
			return JPG;	
		if (match('8','B','P','S'))
			return PSHOP8;
		if (match(172,237,0,5))
			return ZIP;
		return TYPENOTFOUND;
	}

private void init() {
   add(TYPENOTFOUND,"TYPENOTFOUND");
   add(UUENCODED,"UUENCODED");
   add(BTOAD,"BTOAD");
   add(PBM,"PBM");
   add(PGM,"PGM");
   add(PPM,"PPM");
   add(PBM_RAWBITS,"PBM_RAWBITS");
   add(PGM_RAWBITS,"PGM_RAWBITS");
   add(PPM_RAWBITS,"PPM_RAWBITS");
   add(MGR_BITMAP,"MGR_BITMAP");
   add(GIF87a,"GIF87a");
   add(GIF89a,"GIF89a");
   add(IFF_ILBM,"IFF_ILBM");
   add(SUNRASTER,"SUNRASTER");
   add(SGI_IMAGE,"SGI_IMAGE");
   add(CMU_WINDOW_MANAGER_BITMAP,"CMU_WINDOW_MANAGER_BITMAP");
   add(SUN,"SUN");
   add(TIFF_BIG_ENDIAN,"TIFF_BIG_ENDIAN");
   add(TIFF_LITTLE_ENDIAN,"TIFF_LITTLE_ENDIAN");
   add(FLI,"FLI");
   add(MPEG,"MPEG");
   add(SUN_NEXT_AUDIO,"SUN_NEXT_AUDIO");
   add(STANDARD_MIDI,"STANDARD_MIDI");
   add(MICROSOFT_RIFF,"MICROSOFT_RIFF");
   add(BZIP,"BZIP");
   add(IFF_DATA,"IFF_DATA");
   add(NIFF_IMAGE,"NIFF_IMAGE");
   add(PC_BITMAP,"PC_BITMAP");
   add(PDF_DOCUMENT,"PDF_DOCUMENT");
   add(POSTSCRIPT_DOCUMENT,"POSTSCRIPT_DOCUMENT");
   add(SILICON_GRAPHICS_MOVIE,"SILICON_GRAPHICS_MOVIE");
   add(APPLE_QUICKTIME_MOVIE,"APPLE_QUICKTIME_MOVIE");
   add(ZIP_ARCHIVE,"ZIP_ARCHIVE");
   add(UNIX_COMPRESS,"UNIX_COMPRESS");
   add(GZIP,"GZIP");
   add(HUFFMAN,"HUFFMAN");
   add(PNG_IMAGE,"PNG_IMAGE");
   add(JPEG,"JPEG");
   add(JPG,"JPG");
   add(PSHOP8, "Photo Shop...8 bits per pel");
   add(ZIP, "Zip file...Wavelet encoded image sequence?");
}

protected void add(int i, String s) {
   h.put(new Integer(i), s);
}

public String getStringForId(int id) {
    return (String) h.get(new Integer(id));
}



public static final int TYPENOTFOUND = 0;
public static final int UUENCODED = 1; 
public static final int BTOAD =2; 
public static final int PBM =3; 
public static final int PGM =4; 
public static final int PPM =5; 
public static final int PBM_RAWBITS=6;
public static final int PGM_RAWBITS = 7; 
public static final int PPM_RAWBITS = 8; 
public static final int MGR_BITMAP =9;
public static final int GIF87a =10;
public static final int GIF89a =11;
public static final int IFF_ILBM =12;
public static final int SUNRASTER =13;
public static final int SGI_IMAGE =14;
public static final int CMU_WINDOW_MANAGER_BITMAP =15;
public static final int SUN =16;
public static final int TIFF_BIG_ENDIAN =17;
public static final int TIFF_LITTLE_ENDIAN =18;
public static final int FLI =19;
public static final int MPEG =20;
public static final int SUN_NEXT_AUDIO=21;
public static final int STANDARD_MIDI=22;
public static final int MICROSOFT_RIFF=23;
public static final int BZIP=24; 
public static final int IFF_DATA=25;
public static final int NIFF_IMAGE=26;
public static final int PC_BITMAP=27;
public static final int PDF_DOCUMENT=28;
public static final int POSTSCRIPT_DOCUMENT=29;
public static final int SILICON_GRAPHICS_MOVIE=30;
public static final int APPLE_QUICKTIME_MOVIE=31;
public static final int ZIP_ARCHIVE=32;
public static final int UNIX_COMPRESS=33;
public static final int GZIP=34;
public static final int HUFFMAN=35;
public static final int PNG_IMAGE=38;
public static final int JPEG=39;
public static final int JPG=40;	
public static final int PSHOP8=41;	
public static final int ZIP=42;	


protected Hashtable h = new Hashtable();
}