【问题标题】:convert EBCDIC String to ASCII format?将 EBCDIC 字符串转换为 ASCII 格式?
【发布时间】:2011-08-19 10:38:32
【问题描述】:

我有一个从 Db2 表中提取的平面文件,该平面文件包含 char 格式和打包十进制格式的记录。如何将打包数据转换为 java 字符串。有什么办法可以将整个平面文件转换为 ASCII 格式。

【问题讨论】:

    标签: java ebcdic


    【解决方案1】:

    EBCDIC 是一个编码系列。您需要详细了解您所使用的 EBCDIC 编码。

    Java有多个supported encodings,包括:

    • IBM500/Cp500 - EBCDIC 500V1
    • x-IBM834/Cp834 - IBM EBCDIC DBCS-only 韩语(双字节)
    • IBM1047/Cp1047 - EBCDIC 主机的 Latin-1 字符集

    试试这些,看看你会得到什么。比如:

    InputStreamReader rdr = new InputStreamReader(new FileInputStream(<your file>), java.nio.Charset.forName("ibm500"));
        while((String line = rdr.readLine()) != null) {
            System.out.println(line);
    }
    

    【讨论】:

    【解决方案2】:

    将文件读取为字符串,将其写入为 EBCDIC。使用 OutputStreamWriter 和 InputStreamWriter 并在构造函数中给出编码。

    【讨论】:

      【解决方案3】:

      继PAP之后,CP037是美国EBCDIC编码。

      还可以查看JRecord 项目。它允许您读取具有 Cobol 或 Xml 描述的文件,并将处理 EBCDIC 和 Comp-3。

      最后这里是一个将压缩十进制字节转换为字符串的例程,请参阅Conversion中的方法 getMainframePackedDecimal

      【讨论】:

        【解决方案4】:


        我分享一个示例代码供您参考:

            package mypackage;
            import java.io.UnsupportedEncodingException;
            import java.math.BigInteger;
            public class EtoA {
        
        public static void main(String[] args) throws UnsupportedEncodingException {
        
            System.out.println("########");
            String edata = "/ÂÄÀ"; //Some EBCDIC string ==> here the OP can provide the content of flat file which the OP pulled from DB2 table 
            System.out.println("ebcdic source to ascii:");
            System.out.println("ebcdic: " + edata);
            String ebcdic_encoding = "IBM-1047"; //Setting the encoding in which the source was encoded
            byte[] result = edata.getBytes(ebcdic_encoding); //Getting the raw bytes of the EBCDIC string by mentioning its encoding
            String output = asHex(result); //Converting the raw bytes into hexadecimal format
            byte[] b = new BigInteger(output, 16).toByteArray(); //Now its easy to convert it into another byte array (mentioning that this is of base16 since it is hexadecimal)
            String ascii = new String(b, "ISO-8859-1"); //Now convert the modified byte array to normal ASCII string using its encoding "ISO-8859-1"
            System.out.println("ascii: " + ascii); //This is the ASCII string which we can use universally in JAVA or wherever 
        
            //Inter conversions of similar type (ASCII to EBCDIC) are given below:
            System.out.println("########");
            String adata = "abcd";
            System.out.println("ascii source to ebcdic:");
            System.out.println("ascii: " + adata);
            String ascii_encoding = "ISO-8859-1";
            byte[] res = adata.getBytes(ascii_encoding);
            String out = asHex(res);
            byte[] bytebuff = new BigInteger(out, 16).toByteArray();
            String ebcdic = new String(bytebuff, "IBM-1047");
            System.out.println("ebcdic: " + ebcdic);
        
            //Converting from hexadecimal string to EBCDIC if needed
            System.out.println("########");
            System.out.println("hexcode to ebcdic");
            String hexinput = "81828384"; //Hexadecimal which we are converting to EBCDIC
            System.out.println("hexinput: " + hexinput);
            byte[] buffer = new BigInteger(hexinput, 16).toByteArray();
            String eout = new String(buffer, "IBM-1047");
            System.out.println("ebcdic out:" + eout);
        
            //Converting from hexadecimal string to ASCII if needed
            System.out.println("########");
            System.out.println("hexcode to ascii");
            String hexin = "61626364";
            System.out.println("hexin: " + hexin);
            byte[] buff = new BigInteger(hexin, 16).toByteArray();
            String asciiout = new String(buff, "ISO-8859-1");
            System.out.println("ascii out:" + asciiout);
        }
        
        //This asHex method converts the given byte array to a String of Hexadecimal equivalent
        public static String asHex(byte[] buf) {
            char[] HEX_CHARS = "0123456789abcdef".toCharArray();
            char[] chars = new char[2 * buf.length];
            for (int i = 0; i < buf.length; ++i) {
                chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
                chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
            }
            return new String(chars);
        }
        }
        

        【讨论】:

        • 我认为,当您为您的意图添加一些解释时,这对 OP 和更多访问者会更有帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多