2010年10月19日火曜日

ネットワークアドレス計算アプレットのソース

あー、こすげです。前エントリのソースコードを掲載するのを忘れていましたので、載せておきますね。

package com.google.kosugetti.netcalc;

import java.applet.Applet;
import java.awt.HeadlessException;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class NetCalc extends Applet {
    static final long serialVersionUID = 1;
    JTextField  txtIPArea;
    JTextField  txtResult;
    JButton     btnExec;

    public NetCalc() throws HeadlessException {
        txtIPArea = new JTextField("");
        txtResult = new JTextField("");
        btnExec   = new JButton("計算");
    }
    public void init() {
        String  param = getParameter("iparea");
        if (param != null) {
            txtIPArea.setText(param);
        }
        this.setLayout(new GridLayout(3, 1));
        this.add(txtIPArea);
        this.add(txtResult);
        this.add(btnExec);

        btnExec.addActionListener(new BtnExecClicked());
        txtIPArea.addKeyListener(new TxtIPAreaTyped());
    }
    public class BtnExecClicked implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            execCalcCDIR();
        }
    }
    public class TxtIPAreaTyped extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                execCalcCDIR();
            }
        }
    }
    private void execCalcCDIR() {
        long    startAddress = 0L;
        long    endAddress = 0L;
        long    andValue;
        int     mask = 0;
        String  s = txtIPArea.getText();
        StringTokenizer t = new StringTokenizer(s, " .-\t", false);
        if (t.countTokens() == 8) {
            try {
                for (int i = 0; i < 4; i++) {
                    startAddress <<= 8;
                    startAddress += Integer.parseInt(t.nextToken());
                }
                for (int i = 0; i < 4; i++) {
                    endAddress <<= 8;
                    endAddress += Integer.parseInt(t.nextToken());
                }
                andValue = startAddress ^ endAddress;
                for (mask = 0; mask < 32; mask++) {
                    if ((andValue & 0x01) == 0x00) {
                        break;
                    }
                    andValue >>= 1;
                }
                int     top = (int)(startAddress & 0xff000000) >> 24;
                if (top < 0) {
                    top += 256;
                }
                String   result =
                            Integer.toString(top) + "." +
                            Integer.toString((int)(startAddress & 0x00ff0000) >> 16) + "." +
                            Integer.toString((int)(startAddress & 0x0000ff00) >>  8) + "." +
                            Integer.toString((int)(startAddress & 0x000000ff)      ) + "/" +
                            Integer.toString(32 - mask);
                txtResult.setText(result);
                txtResult.requestFocus();
                txtResult.selectAll();
            } catch (NumberFormatException e) {
                txtResult.setText("IPAddressが不正");
            }
        } else {
            txtResult.setText("IPAddressが不正");
        }
    }
}
で、いつも思うんですけど、javaってunsignedのデータ型がないんで、苦労するんですよね。
あ、このソースのライセンスは、GPLv2ということで

0 件のコメント:

コメントを投稿