【问题标题】:Hex into EBCDIC十六进制转换为 EBCDIC
【发布时间】:2018-01-06 23:28:56
【问题描述】:

我有一个 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();
        }
        }
    });

示例输入:

f1f2f3f4

翻译:

1234

它只是抛出这个错误:

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

这段代码有什么问题?

【问题讨论】:

  • chars2.toString()? byte[] 数组不会覆盖 toString();它只是从 Object 类继承而来。
  • 考虑问你真正想问的问题。您不是在尝试将 EBCDIC 转换为十六进制,而是将 EBCDIC 转换为 ASCII。
  • 哦,好吧,但我真的想把它转换成十六进制:O
  • 考虑添加“预期输出”部分。

标签: java string hex converter ebcdic


【解决方案1】:

从您想要获取可读字符的十六进制数字字符串中,将十六进制字符串解释为 EBCDIC 编码。

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

你应该这样做:

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

  • 将结果创建为new String(bytes, "IBM-273")

还有风格推荐:

将逻辑提取到类似String stringFromEbcdicHex(String ebcdicHexDigits)的方法中。

编辑:

要解析 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));
}

【讨论】:

  • 感谢您的快速答复。如何解析 2 个字符的子字符串?
【解决方案2】:

以下行看起来很可疑:

byte[] b = {(byte) Integer.parseInt(chars2.toString(),16)}; 

假设您的 EBCDIC 在 byte[] 数组中,您可以使用方法将其呈现为 HEX -> 例如来自此答案:How to convert a byte array to a hex string in Java?

编辑:

您确定您使用的是正确的 EBCDIC 编码名称吗? https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html 状态 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
    }
}

【讨论】:

  • 嗯....我读了评论,但我不明白它是如何解决我的问题的:/你能给我解释一下吗?
  • 是的,它是正确的,因为它包含仅在德国存在的字母。
  • 这对我帮助很大。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2011-07-28
  • 2014-12-31
相关资源
最近更新 更多