Java 十六进制到EBCDIC

Java 十六进制到EBCDIC,java,string,hex,converter,ebcdic,Java,String,Hex,Converter,Ebcdic,我有一个GUI,尝试将EBCDIC字符串转换为十六进制,但它不起作用:/ ebcdichex.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { output6.setText(""); String hexadecimal3 = input4.getText().replace("\n", "");

我有一个GUI,尝试将EBCDIC字符串转换为十六进制,但它不起作用:/

ebcdichex.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            output6.setText("");
            String hexadecimal3 = input4.getText().replace("\n", "");
            byte[] chars2;

            try {
                chars2 = hexadecimal3.getBytes("IBM-273");
                StringBuilder hexa2 = new StringBuilder();
                for(int i = 0;i<chars2.length;i++){
                    byte[] b = {(byte) Integer.parseInt(chars2.toString(),16)};     
                    hexa2.append(b);
                }
                output6.append(hexa2.toString());
            }
         catch (UnsupportedEncodingException e1) {

            e1.printStackTrace();
        }
        }
    });
翻译成:

1234
它只是抛出了这个错误:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "[B@147c5fc"

此代码有什么问题?

以下行看起来可疑:

byte[] b = {(byte) Integer.parseInt(chars2.toString(),16)}; 
假设您的EBCDIC位于byte[]数组中,您可以使用方法将其表示为十六进制->例如,从以下答案:

编辑:

是否确实为EBCDIC使用了正确的编码名称? 国家Cp273

编辑#2: 好了,现在我得到你想要的了。下面是一个示例代码:

import java.util.*;
import java.lang.*;
import java.io.*;

class Conversion
{
    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                                 + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        String hexadecimal3 = "f1f2f3f4";
        byte[] ebcdic = hexStringToByteArray(hexadecimal3);
        System.out.println(  new String(ebcdic, "Cp273") ); // prints 1234
    }
}
import java.util.*;
导入java.lang.*;
导入java.io.*;
类转换
{
公共静态字节[]hexStringToByteArray(字符串s){
int len=s.length();
字节[]数据=新字节[len/2];
对于(int i=0;i数据[i/2]=(字节)((Character.digit(s.charAt(i),16)从十六进制数字字符串中,您希望获得可读字符,将十六进制字符串解释为EBCDIC编码

在您的代码中,使用
chars2=hexadecimal3.getBytes(“IBM-273”);
创建一个字节序列,将十六进制数字从
hexadecimal3
逐个编码到EBCDIC。稍后,您尝试将该EBCDIC字节序列转换回字符串
chars2.toString()
,不告诉Java它是EBCDIC,并尝试将其解析为十六进制

你应该做:

  • 将输入中的所有2字符子字符串分别解析为十六进制数,并将结果存储为字节数组
    字节

  • 将结果创建为新字符串(字节,“IBM-273”)

还有一个风格建议:

将逻辑提取到方法中,如
stringstringfromEBCDICHEX(stringEBCDICHEXDights)

编辑:

要解析2个字符的子字符串,可以执行以下操作:

byte[] bytes = new byte[ebcdicHexDigits.length/2];
for (int i=0; i<bytes.length; i++) {
    bytes[i] = (byte) Integer.parseInt(ebcdicHexDigits.substring(2*i, 2*i+2));
}
byte[]bytes=新字节[ebcdicHexDigits.length/2];

对于(int i=0;i
chars2.toString()
字节[]
数组不会覆盖
toString()<或代码>;它只从类<代码>对象< /代码>继承。考虑询问您实际上想问的问题。您不试图将EBCDIC转换为十六进制,您正在将EBCDIC转换为ASCII。OK,但是我真的想把它转换成十六进制:考虑添加“预期输出”。section.Hmmm…我读了评论,但我不明白它是如何解决我的问题的:/你能给我解释一下吗?是的,它是正确的,因为它包含的字母只存在于德国。这对我帮助很大。谢谢你的快速回答。我如何解析2个字符的子字符串?
byte[] bytes = new byte[ebcdicHexDigits.length/2];
for (int i=0; i<bytes.length; i++) {
    bytes[i] = (byte) Integer.parseInt(ebcdicHexDigits.substring(2*i, 2*i+2));
}