/**************************************************************
* MessageDigester
* MD.java
*
* Author: ShuiDaJiao<wolf86@126.com>
* Parameter: None
* Creation date: 2007.11.10
* LastUpdate: None
* Version:1.0
**************************************************************/
import java.awt.Color;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.FileDialog;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.FileInputStream;
import java.security.MessageDigest;
import java.util.Iterator;
import javax.swing.JButton;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
class MDCompute{
String algorithm=null;
StringBuffer resultBuf=new StringBuffer("");
String result=null;
byte [] input;
byte [] output;
MessageDigest mess=null;
MDCompute(){
}
MDCompute(String algorithm,byte [] input){
this.algorithm=algorithm;
this.input=input;
}
public void setParam(String algorithm,byte [] input){
this.algorithm=algorithm;
this.input=input;
}
public void setParam(String algorithm){
this.algorithm=algorithm;
}
public String getResult(){
try{
mess=MessageDigest.getInstance(algorithm);
mess.update(input);
output=mess.digest();
int val;
for (int i=0; i<output.length; i++){
//val = ((int) output[i] ) & 0xff;
val=output[i];
if(val<0) val+= 256;
if (val < 16) resultBuf.append("0");
resultBuf.append(Integer.toHexString(val));
}
result=resultBuf.toString();
resultBuf.delete(0,resultBuf.length());;
return result;
}
catch(Exception e){
System.out.println("error");
return null;
}
}
public String getResult(String algorithm){
this.algorithm=algorithm;
return getResult();
}
}
public class MD extends JFrame implements ActionListener , MouseListener,DropTargetListener{
JButton browse=new JButton("浏 览");
JButton compute=new JButton("计 算");
JButton compare=new JButton("比 较");
JButton exit=new JButton("退 出");
JTextField fileField=new JTextField();
JTextField resultField=new JTextField();
JTextField compareField=new JTextField();
JTextField fileSizeField=new JTextField();
JRadioButton md5=new JRadioButton("MD5",true);
JRadioButton sha=new JRadioButton("SHA");
ButtonGroup bg=new ButtonGroup();
MDCompute mdc=new MDCompute();
String filePath=null;
byte [] content;
long time1=0;
long time2=0;
long time3=0;
MD(){
setTitle("--MessageDigester-- by ShuiDaJiao");
Dimension size=Toolkit.getDefaultToolkit().getScreenSize();
setBounds((size.width-450)/2,(size.height-200)/2,450,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
GridLayout gl=new GridLayout(5,1,10,10);
new DropTarget(this,this);
bg.add(md5);
bg.add(sha);
fileField.setForeground(Color.BLUE);
resultField.setForeground(Color.BLUE);
compareField.setForeground(Color.GREEN);
fileSizeField.setForeground(Color.BLUE);
fileField.setToolTipText("支持拖放");
resultField.setToolTipText("双击复制");
resultField.setEditable(false);
compareField.setToolTipText("双击粘贴");
fileSizeField.setToolTipText("双击复制");
fileSizeField.setEditable(false);
JPanel panel1=new JPanel(gl);
JPanel panel2=new JPanel(gl);
JPanel panel3=new JPanel(gl);
JPanel radioPane=new JPanel();
panel1.add(new JLabel("文件路径:"));
panel1.add(new JLabel("选择算法:"));
panel1.add(new JLabel("计算结果:"));
panel1.add(new JLabel("参照值串:"));
panel1.add(new JLabel("文件大小:"));
panel2.add(fileField);
radioPane.add(md5);
radioPane.add(sha);
radioPane.setBorder(new LineBorder(Color.GREEN,1));
panel2.add(radioPane);
panel2.add(resultField);
panel2.add(compareField);
panel2.add(fileSizeField);
panel3.add(browse);
panel3.add(compute);
panel3.add(new JLabel());
panel3.add(compare);
panel3.add(exit);
JPanel rootPane=new JPanel(new BorderLayout(5,1));
rootPane.setBorder(new LineBorder(Color.BLUE,3));
rootPane.add(panel1,"West");
rootPane.add(panel2);
rootPane.add(panel3,"East");
getContentPane().add(rootPane);
resultField.addMouseListener(this);
compareField.addMouseListener(this);
fileSizeField.addMouseListener(this);
browse.addActionListener(this);
compute.addActionListener(this);
compare.addActionListener(this);
exit.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
Object o=e.getSource();
if(o==browse){
FileDialog openFile=new FileDialog(this,"打开文件...",FileDialog.LOAD);
openFile.setVisible(true);
String dir=openFile.getDirectory();
String name=openFile.getFile();
if(dir!=null&&name!=null){
filePath=dir+name;
fileField.setText(filePath);
resultField.setText("");
fileSizeField.setText("");
}
}
else if(o==compute){
doCompute();
}
else if(o==compare&&!resultField.getText().equals("")&&!compareField.getText().equals("")){
if(resultField.getText().equalsIgnoreCase(compareField.getText()))
JOptionPane.showMessageDialog(this,"比较结果相同 !","比较结果",JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(this,"比较结果不同 !","比较结果",JOptionPane.WARNING_MESSAGE);
}
else if(o==exit){
System.exit(0);
}
}
private void doCompute(){
try{
FileInputStream fis=new FileInputStream(fileField.getText());
content=new byte[fis.available()];
fis.read(content);
fis.close();
fileSizeField.setText(Integer.toString(content.length)+" (Byte)");
mdc.setParam((md5.isSelected()?"MD5":"SHA"),content);
resultField.setText(mdc.getResult());
}
catch(Exception ex)
{
resultField.setText("文件名无效");
fileSizeField.setText("");
}
}
public void mouseClicked(MouseEvent e) {
long occurTime=e.getWhen();
Object o=e.getSource();
if(o==resultField){
if((occurTime-time1)<300){
resultField.selectAll();
resultField.copy();
}
time1=occurTime;
}
else if(o==compareField){
if((occurTime-time2)<300){
compareField.selectAll();
compareField.paste();
}
time2=occurTime;
}
else{
if((occurTime-time3)<300){
fileSizeField.selectAll();
fileSizeField.copy();
}
time3=occurTime;
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void dragEnter(DropTargetDragEvent e){
if(e.getDropAction()!=DnDConstants.ACTION_MOVE){
e.rejectDrag();
}
}
public void dragExit(DropTargetEvent e){
}
public void dragOver(DropTargetDragEvent e){
}
public void dropActionChanged(DropTargetDragEvent e){
}
public void drop(DropTargetDropEvent e){
e.acceptDrop(DnDConstants.ACTION_COPY);
Transferable trans = e.getTransferable();
DataFlavor[] fla = trans.getTransferDataFlavors();
for (int i=0; i<fla.length; i++){
DataFlavor d=fla[i];
try{
if(d.equals(DataFlavor.javaFileListFlavor)){
java.util.List fileList = (java.util.List)trans.getTransfe