【问题标题】:ASCII to EBCDIC Character IncodingASCII 到 EBCDIC 字符编码
【发布时间】:2015-06-23 20:02:07
【问题描述】:

将 ASCII 字符串转换为 EBCDIC 时:

System.out.println(new String("0810C2200000820000000400000000000000052852304131419391011590620022300270".getBytes("UTF-8"), "CP1047"));

我得到以下输出字符串:

ä??????

但是,我想要的是:

F0 F8    F1 F0    C2 20    00 00    82 00    00 00    04 00  00 00    00 00    00 00   F4 F1    F0 F1    F1 F5  F9 F0    F6 F2    F0 F0    F2 F2    F3 F0    F0 F2    F7 F0

我怎样才能实现它?任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 格式重要吗?还是要将字节输出为以 cp1047 编码的文本?
  • 您正在使用此代码 CP1047 UTF-16 解码。转为EBCDIC的结果是字节数组,不是String。

标签: java character-encoding hex ascii ebcdic


【解决方案1】:

你可以这样转换字符串

String string = "0810C220";
byte[] bytes = string.getBytes("CP1047");
for (int i = 0; i < bytes.length; i++) {
    System.out.printf("%s %X%n", string.charAt(i), bytes[i]);
}

但你的例子似乎是错误的。

以下是正确的,输入字符串中的一个字符被转换为相关的EBCDIC代码

0 F0
8 F8
1 F1
0 F0

您的示例是错误的,因为您的示例将 C220 视为输入字符串中的两个字符,而不是 EBCDIC 代码中的两个字符

C C3
2 F2
2 F2
0 F0

对于另一个方向的转换,您可以这样做

// string with hexadecimal EBCDIC codes
String sb = "F0F8F1F0";
int countOfHexValues = sb.length() / 2;
byte[] bytes = new byte[countOfHexValues];
for(int i = 0; i < countOfHexValues; i++) {
    int hexValueIndex = i * 2;
    // take one hexadecimal string value
    String hexValue = sb.substring(hexValueIndex, hexValueIndex + 2);
    // convert it to a byte
    bytes[i] = (byte) (Integer.parseInt(hexValue, 16) & 0xFF);
}
// constructs a String by decoding bytes as EBCDIC
String string = new String(bytes, "CP1047");

【讨论】:

  • 我怎样才能实现它的反转,意味着从字符串 str="F0F8F1F0" 到 0810?
  • 谢谢,帮了大忙!!
  • 我正面临从十六进制转换为 ascii 的另一个问题,即它给我一些十六进制值的损坏数据,可能是正十六进制。你能告诉我如何解决它吗?
  • 像这样:000086^Ìb*
  • 你试过什么?你想转换成 ASCII 的十六进制字符串是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多