Hex в EBCDIC
У меня есть графический интерфейс, где я пытаюсь преобразовать строку 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"
Что не так с этим кодом?
2 ответа
Следующая строка выглядит подозрительно:
byte[] b = {(byte) Integer.parseInt(chars2.toString(),16)};
Предполагая, что у вас есть EBCDIC в массиве byte[], вы можете использовать метод, чтобы представить его как HEX ->, например, из этого ответа: Как преобразовать байтовый массив в шестнадцатеричную строку в 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));
}