【问题标题】:Conversion of HEX string to EBCDIC returns Number Format exception将 HEX 字符串转换为 EBCDIC 会返回数字格式异常
【发布时间】:2017-07-21 10:14:49
【问题描述】:

我正在尝试转换由十六进制数据组成的字符串,例如C120,这分别表示A(空格)。我正在获取字符串并尝试将其拆分为字符串数组。然后我试图迭代这个数组并获得相应的UTF-8 值。以下是我的代码:

public static String toEbcdic(String strToConvert){
    String[] test = strToConvert.split("(?<=\\G..)");
    ByteBuffer sb = ByteBuffer.allocate(test.length);
    for (String s : test) {
        Byte valueOf = Byte.valueOf(s, 10);
        sb.put(valueOf);
    }
    return new String(sb.array(), "CP1047");
}

当通过输入C120C2,我得到以下异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "C1"

我做错了什么?应该怎么做才能得到对应的EBCDIC值?

【问题讨论】:

    标签: java string utf-8 hex


    【解决方案1】:

    简单的单行:

    public static String toEbcdic( String hexStr ) throws IOException {
       return new String( DatatypeConverter.parseHexBinary( hexStr ), "CP1047" );
    }
    

    您的代码方向正确,通过转换为字节数组并在 CP1047 中创建一个新字符串。 您只需要解决两个问题即可使其正常工作:

    1. 字节字符串是十六进制(以 16 为基数)而不是十进制(以 10 为基数)。
    2. Java 字节已签名,因此输入 C1 会触发“值超出范围”异常。
      解决方案很简单:解析为 short 并转换回字节。

    这是一个完整的固定示例:

    import java.io.IOException;
    import java.nio.ByteBuffer;
    
    public class Q45235042 {
    
       public static String toEbcdic( String strToConvert ) throws IOException {
          String[] test = strToConvert.split( "(?<=\\G..)" );
          ByteBuffer sb = ByteBuffer.allocate( test.length );
          for ( String s : test )
             sb.put( (byte) Short.parseShort( s, 16 ) );
          return new String( sb.array(), "CP1047");
       }
    
       public static void main( String[] args ) throws IOException {
          System.out.println( toEbcdic( "C120C2" ) );
       }
    }
    

    【讨论】:

    • 辛苦了一个星期,你救了我。希望它以前发生过。谢谢!我从来没有想过先做空然后再字节。但是一个班轮很棒。再次感谢!不幸的是,赏金可以在 20 小时后颁发,所以一旦过了时间我就会这样做。 :)
    【解决方案2】:

    十六进制是基数 16 而不是基数 10。更改

    Byte valueOf = Byte.valueOf(s, 10); 
    

    Byte valueOf = Byte.valueOf(s, 16);
    

    使用Byte.parseByte(String, int) 获取原始类型(而不是包装器)。

    byte valueOf = Byte.parseByte(s, 16);
    

    【讨论】:

    • 我不是想将其转换为十六进制,而是转换为 ebcdic 值。
    • 没有。您正在尝试将十六进制值转换为二进制。并且“c”不是十进制的有效数字。
    • 好的,那么如何将十六进制字符串转换为 ebcdic 表示形式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2015-12-31
    • 2015-12-07
    • 2016-08-28
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多