View Javadoc

1   //Copyright (C) 2004, Brian Enigma <enigma at netninja.com>
2   //This file is part of MagicCodes.
3   //
4   //MagicCodes is free software; you can redistribute it and/or modify
5   //it under the terms of the GNU General Public License as published by
6   //the Free Software Foundation; either version 2 of the License, or
7   //(at your option) any later version.
8   //
9   //MagicCodes is distributed in the hope that it will be useful,
10  //but WITHOUT ANY WARRANTY; without even the implied warranty of
11  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  //GNU General Public License for more details.
13  //
14  //You should have received a copy of the GNU General Public License
15  //along with Foobar; if not, write to the Free Software
16  //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  package org.ninjasoft.magiccodes.plugins;
18  
19  import java.io.*;
20  
21  /***
22   * Plugin to analyze letter frequency
23   * @author enigma
24   */
25  public class AnalyzeFrequency implements Plugin {
26  	public String getName() {
27  		return "Analyze Frequency";
28  	}
29  	public String getDescription() {
30  		return "Analyzes Letter Frequency";
31  	}
32  	public boolean usesKey() {
33  		return false;
34  	}
35      public boolean isInformational() {
36          return true;
37      }
38  	public int[] doAction(int[] in, int[] key) {
39          int frequencies[] = new int[256];
40          int max = 0;
41          ByteArrayOutputStream out = new ByteArrayOutputStream();
42          // Zero out everything (not REALLY necessary in Java, but still good practice)
43          for (int i=0; i<frequencies.length; i++)
44              frequencies[0] = 0;
45          // Count everything
46          for (int i=0; i<in.length; i++) {
47              int letter = in[i] % 256;
48              max = Math.max(max, ++frequencies[letter]);
49          }
50          // Get the results
51          try{
52              out.write("Letter frequencies:\n".getBytes());
53              // Yeay for Bubble Sort/Search...
54              for (int i = max; i> 0; i--) {
55                  for (int j = 0; j < frequencies.length; j++) {
56                      if (frequencies[j] == i) {
57                          String hexCode = Integer.toString(j, 16);
58                          if (hexCode.length() == 1)
59                              hexCode = "0" + hexCode;
60                          out.write("Character 0x".getBytes());
61                          out.write(hexCode.getBytes());
62                          out.write(" (ASCII ".getBytes());
63                          if ((j >= 0x20) && (j <= 0x7E)) {
64                              out.write("\"".getBytes());
65                              out.write((char) j);
66                              out.write("\")         ".getBytes());
67                          }else{
68                              out.write("unprintable) ".getBytes());
69                          }
70                          out.write(Integer.toString(frequencies[j]).getBytes());
71                          out.write("\n".getBytes());
72                      }
73                  }
74              }
75          }catch(IOException e){
76              e.printStackTrace();
77          }
78          // Convert to result
79          int[] result = new int[out.size()];
80          byte[] data = out.toByteArray();
81          for (int i=0; i<data.length; i++)
82              result[i] = data[i];
83  		return result;
84  	}
85  }