Java 十六进制到EBCDIC
我有一个GUI,尝试将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", "");
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;ichars2.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));
}