编码的理解

我的一同学要我写一个ASCII码转换程序,我才发现我一直对于ASCII,unicode码还不是很

清楚所以网上搜了一下,写了一个简单的java的ASCII码转换程序,其实我想用c语言写会更

方便,以后参考:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.Border;

public class Convert extends JFrame {

    public static void main(String[] args) {
        new Convert();
    }

    JTextArea label;
    JButton button1;
    JButton button2;
    JButton button3;
    JTextField textField;

    public Convert() {
        super();
        this.setTitle("convert");
        this.setSize(300, 250);
        label = new JTextArea(10, 25);
        label.setLineWrap(true);
        button1 = new JButton("文字转ASCII码");
        button2 = new JButton("清除");
        button3 = new JButton("ASCII码转文字");
        textField = new JTextField(21);
        this.setLayout(new FlowLayout());
        this.add(textField);
        this.add(button1);
        this.add(button3);
        this.add(button2);
        this.add(label);
        // pack();
        this.setVisible(true);
        button1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (textField.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "输入不能为空");
                } else {
                    label.setText(convert(textField.getText()));
                    // convertUnicode(textField.getText());
                }
            }
        });
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                textField.setText("");
                label.setText("");
            }
        });
        button3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (textField.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "输入不能为空");
                } else {
                    label.setText(DeConvert(textField.getText()));
                    // DeConvertUnicode(textField.getText());
                }
            }
        });
    }
    /*
     * //方法2: private static String hexString = "0123456789ABCDEF";//设置编码格式
     * public String convert(String s){ byte[] bytes = s.getBytes();
     * StringBuilder sb = new StringBuilder(bytes.length * 2); //
     * 将字节数组中每个字节拆解成2位16进制整数 for (int i = 0; i < bytes.length; i++) {
     * sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
     * sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0)); } return

     * sb.toString(); } public String DeConvert(String s){ ByteArrayOutputStream

     * baos = new ByteArrayOutputStream(s.length() / 2); // 将每2位16进制整数组装成一个字节
     * for (int i = 0; i < s.length(); i += 2)
     * baos.write((hexString.indexOf(s.charAt(i)) << 4 |
     * hexString.indexOf(s.charAt(i + 1)))); return new
     * String(baos.toByteArray()); }
     */

    public String convert(String s) {
        String ret = "";
        byte[] b = null;
        b = s.getBytes();
        for (int i = 0; i < b.length; i++) {
            String hex = Integer.toHexString(b[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            ret += hex.toUpperCase();
        }
        return ret;
    }
    public String DeConvert(String s) {
        byte[] b = new byte[s.length() / 2];
        int j = 0;
        for (int i = 0; i < s.length(); i += 2) {
            b[j] = (byte) (Integer.parseInt(s.substring(i, i + 2), 16) & 0xff);// 这里的十六表示十六进制
            j++;
        }
        return new String(b);
    }
    /*
     * 在32位的电脑中数字都是以32格式存放的,如果是一个byte(8位)类型的数字,他的高24位里面
     * 是随机数字,低8位才是实际的数据。java.lang.Integer.toHexString() 方法的参数是int(32位)类型,
     * 如果输入一个byte(8位)类型的数字,这个方法会把这个数字的高24为也看作有效位,这就必然导致错误, 使用
     * 0XFF操作,可以把高24位置0以避免这样错误的发生。<<表示左移n位,空位补零,相当于乘2,>>表示右移n位,
     * 空位用原最高位的值补足,相当于除2 ,integer.toHexString()方法为将int数据转为十六进制,touppercase()方法
     * 为将字符串中的字母全部改为大写
     */
    public void convertUnicode(String s) {
        char[] chars = s.toCharArray(); // 把字符中转换为字符数组
        System.out.println("\n\n汉字 ASCII\n----------------------");
        for (int i = 0; i < chars.length; i++)
            // System.out.println(" "+chars[i]+" "+(int)chars[i]);//这里转换成的是十进制unicode内码
            System.out.println(chars[i] + " "
                    + Integer.toHexString((int) (chars[i])).toUpperCase());// 这里转换成的是十六进制unicode内码
    }
    public void DeConvertUnicode(String s) {
        String[] chars = s.split(" ");
        System.out.println("ASCII 汉字 \n----------------------");
        for (int i = 0; i < chars.length; i++)
            System.out.println(chars[i] + " "
                    + (char) Integer.parseInt(chars[i]));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值