⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radixconvertor.java

📁 用于串口通讯测试的工具软件。完全使用java语言编写。
💻 JAVA
字号:
package com.zcsoft.jpsc.gui;

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
/**
 * <p>Title: 串口通信</p>
 * <p>Description: 串口通信实验</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: Zhicheng Software&Service Co. Ltd.</p>
 * @author 蒋智湘
 * @version 1.0
 */
/** 字符、二进制、十进制或十六进制值相互转换显示类 */
public class RadixConvertor extends JPanel implements ActionListener
{
	private static ResourceBundle res = JpscToolkit.getStringResourceBundle();
	/** 进制 */
	private static final int[] radixes = new int[]{Character.MIN_RADIX - 1, 10, 16, 2};
	/** 进制类型描述 */
	private final String[] radixName
			= new String[]{res.getString("convertor.radix.character"),
								res.getString("convertor.radix.decimal"),
								res.getString("convertor.radix.hex"),
								res.getString("convertor.radix.binary")};
	/** 输入进制类型的文本输入框 */
	private JTextField[] radixValueField = new JTextField[radixes.length];
	/** 控制字符之文字描述索引表 */
	private static Map controlSet = new Hashtable();
	/** 分隔符 */
	private JTextField txtDelimiter = new JTextField(" ", 5);

	static
	{
		storeConstrolSet();
	}

	public RadixConvertor()
	{
		super(new GridBagLayout());
		jbInit();
	}

	/** 构建界面 */
	private void jbInit()
	{
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.anchor = GridBagConstraints.WEST;
		gbc.gridy = 1;
		gbc.gridx = 1;
		this.add(new JLabel(res.getString("convertor.delimiter")), gbc);
		gbc.gridx ++;
		this.add(this.txtDelimiter, gbc);

		for (int i = 0; i < radixValueField.length; i++)
		{
			gbc.gridy ++;
			gbc.fill = GridBagConstraints.NONE;
			gbc.gridx = 1;
			gbc.weightx = 0;
			this.add(new JLabel(radixName[i]), gbc);

			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.gridx ++;
			gbc.weightx = 1;
			this.add(radixValueField[i] = new JTextField(10), gbc);

			radixValueField[i].addActionListener(this);
		}
	}

	/** 进制值输入框上回车事件实现 */
	public void actionPerformed(ActionEvent e)
	{
		String strValue = ((JTextField)e.getSource()).getText();
		if(strValue.length() == 0)
		{
			return;
		}
		int fieldIndex = indexOfRadixField(e.getSource());
		if (fieldIndex == -1)
		{
			return;
		}
		int radix = radixes[fieldIndex];

		for (int i = 0; i < radixes.length; i++)
		{
			try
			{
				if (i == fieldIndex)
				{
					continue;
				}
				int toRadix = radixes[i];
				StringBuffer convertedStrBuffer = new StringBuffer();
				String delim = this.txtDelimiter.getText();
				if (strValue.length() > 1)
				{
					StringTokenizer st = new StringTokenizer(strValue, String.valueOf(delim));
					while(st.hasMoreTokens())
					{
						convertOneToken(convertedStrBuffer, st.nextToken(), delim, radix, toRadix);
					}
				}
				else
				{
					convertOneToken(convertedStrBuffer, strValue, delim, radix, toRadix);
				}
				this.radixValueField[i].setText(convertedStrBuffer.substring(0, convertedStrBuffer.length() - delim.length()));
			}
			catch (NumberFormatException ex)
			{
				((JTextField)e.getSource()).selectAll();
				return;
			}
		}
	}

	private void convertOneToken(StringBuffer storeBuffer, String token
										  , String delim
										  , int radixFrom, int toRadix)
			throws NumberFormatException
	{
		int intValue;
		if (isCharFormat(radixFrom))
		{
			Character controlCode;
			if(token.length() > 1
				&& token.charAt(0) == '\\'
				&& token.charAt(1) != '\\'
				&& (controlCode = findASCIIByControlName(token)) != null)
			{
				intValue = controlCode.charValue();
			}
			else
			{
				for (int i = 0; i < token.length(); i++)
				{
					storeBuffer.append(toString(token.charAt(i), toRadix));
					storeBuffer.append(delim);
				}
				return;
			}
		}
		else
		{
			intValue = Integer.parseInt(token, radixFrom);
		}
		storeBuffer.append(toString(intValue, toRadix));
		storeBuffer.append(delim);
	}

	/**
	 * 根据控制字符的名称查找对应的ASCII码值
	 * @param controlCodeName
	 * @return 如果没有找到,则返回null
	 * @see #controlSet
	 */
	private Character findASCIIByControlName(String controlCodeName)
	{
		Iterator elements = controlSet.entrySet().iterator();
		while (elements.hasNext())
		{
			Map.Entry entry = (Map.Entry)elements.next();
			if (controlCodeName.equals(entry.getValue()))
			{
				return (Character)entry.getKey();
			}
		}
		return null;
	}

	/**
	 * 某个指定ASCII码在某个指定的进制下的字符串表示
	 * @param ASCII
	 * @param radix 1/2/10/16进制。1代表字符串
	 * @return 对于控制字符,则从controlSet中找到并返回它对应的名称,如果找不到,则返回null。
	 *
	 */
	private String toString(int ASCII, int radix)
	{
		String strValue;
		if (isCharFormat(radix))
		{
			char charValue = (char)ASCII;
			if (Character.isISOControl(charValue))
			{
				strValue = (String)controlSet.get(new Character(charValue));
			}
			else
			{
				strValue = String.valueOf(charValue);
			}
		}
		else
		{
			strValue = Integer.toString(ASCII, radix);
		}
		return strValue;
	}


	private static boolean isCharFormat(int radix)
	{
		return radix < Character.MIN_RADIX;
	}

	/**
	 * 查找触发回车事件的进制输入框的索引。程序可依据该索引值找到对应的进制
	 * @param eventSource 触发回车事件的组件
	 * @return eventSource在radixValueField数组上的索引。如果没有,则返回-1。
	 */
	private int indexOfRadixField(Object eventSource)
	{
		int index = -1;
		for (int i = 0; i < radixValueField.length; i++)
		{
			if (radixValueField[i] == eventSource)
			{
				index = i;
				break;
			}
		}
		return index;
	}

	/** 记录控制字符映射表 */
	private static void storeConstrolSet()
	{
		controlSet.put(new Character((char)0), res.getString("controlKey.0"));
		controlSet.put(new Character((char)1), res.getString("controlKey.1"));
		controlSet.put(new Character((char)2), res.getString("controlKey.2"));
		controlSet.put(new Character((char)3), res.getString("controlKey.3"));
		controlSet.put(new Character((char)4), res.getString("controlKey.4"));
		controlSet.put(new Character((char)5), res.getString("controlKey.5"));
		controlSet.put(new Character((char)6), res.getString("controlKey.6"));
		controlSet.put(new Character((char)7), res.getString("controlKey.7"));
		controlSet.put(new Character('\b'), res.getString("controlKey.8"));
		controlSet.put(new Character('\t'), res.getString("controlKey.9"));
		controlSet.put(new Character('\n'), res.getString("controlKey.10"));
		controlSet.put(new Character((char)0xB), res.getString("controlKey.11"));
		controlSet.put(new Character('\f'), res.getString("controlKey.12"));
		controlSet.put(new Character('\r'), res.getString("controlKey.13"));
		controlSet.put(new Character((char)0xE), res.getString("controlKey.14"));
		controlSet.put(new Character((char)0xF), res.getString("controlKey.15"));
		controlSet.put(new Character((char)0x10), res.getString("controlKey.16"));
		controlSet.put(new Character((char)0x11), res.getString("controlKey.17"));
		controlSet.put(new Character((char)0x12), res.getString("controlKey.18"));
		controlSet.put(new Character((char)0x13), res.getString("controlKey.19"));
		controlSet.put(new Character((char)0x14), res.getString("controlKey.20"));
		controlSet.put(new Character((char)0x15), res.getString("controlKey.21"));
		controlSet.put(new Character((char)0x16), res.getString("controlKey.22"));
		controlSet.put(new Character((char)0x17), res.getString("controlKey.23"));
		controlSet.put(new Character((char)0x18), res.getString("controlKey.24"));
		controlSet.put(new Character((char)0x19), res.getString("controlKey.25"));
		controlSet.put(new Character((char)0x1A), res.getString("controlKey.26"));
		controlSet.put(new Character((char)0x1B), res.getString("controlKey.27"));
		controlSet.put(new Character((char)0x1C), res.getString("controlKey.28"));
		controlSet.put(new Character((char)0x1D), res.getString("controlKey.29"));
		controlSet.put(new Character((char)0x1E), res.getString("controlKey.30"));
		controlSet.put(new Character((char)0x1F), res.getString("controlKey.31"));
		/*
		00  NUL  空字符
01  SOH  标题起始 (Ctrl/A)
02  STX  文本起始 (Ctrl/B)
03  ETX  文本结束 (Ctrl/C)
04  EOT  传输结束 (Ctrl/D)
05  ENQ  询问 (Ctrl/E)
06  ACK  认可 (Ctrl/F)
07  BEL  铃 (Ctrl/G)
08  BS  退格 (Ctrl/H)
09  HT  水平制表栏 (Ctrl/I)
0A  LF  换行 (Ctrl/J)
0B  VT  垂直制表栏 (Ctrl/K)
0C  FF  换页 (Ctrl/L)
0D  CR  回车 (Ctrl/M)
0E  SO  移出 (Ctrl/N)
0F  SI  移入 (Ctrl/O)
10  DLE  数据链接丢失 (Ctrl/P)
11  DC1  设备控制 1 (Ctrl/Q)
12  DC2  设备控制 2 (Ctrl/R)
13  DC3  设备控制 3 (Ctrl/S)
14  DC4  设备控制 4 (Ctrl/T)
15  NAK  否定接受 (Ctrl/U)
16  SYN  同步闲置符 (Ctrl/V)
17  ETB  传输块结束 (Ctrl/W)
18  CAN  取消 (Ctrl/X)
19  EM  媒体结束 (Ctrl/Y)
1A  SUB  替换 (Ctrl/Z)
1B  ESC  换码符
1C  FS  文件分隔符
1D  GS  组分隔符
1E  RS  记录分隔符
1F  US  单位分隔符

		*/
	}

//
//	public static void main(String[] args)
//	{
//		JFrame f = new JFrame();
//		f.getContentPane().add(new RadixConvertor());
//		f.pack();
//		f.show();
//	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -