十六进制到 EBCDIC
Hex into EBCDIC
我有一个 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"
这段代码有什么问题?
以下行看起来很可疑:
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
}
}
您希望从十六进制数字字符串中获取可读字符,将十六进制字符串解释为 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));
}
我有一个 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"
这段代码有什么问题?
以下行看起来很可疑:
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
}
}
您希望从十六进制数字字符串中获取可读字符,将十六进制字符串解释为 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));
}