当前位置: 首页 > 知识库问答 >
问题:

用java实现EBCDIC到ASCII的转换

韶镜
2023-03-14

我应该使用Java将EBCDIC文件转换为ASCII。到目前为止,我有以下代码:

public class Migration {
    InputStreamReader reader;
    StringBuilder builder;

    public Migration(){
        try {
            reader = new InputStreamReader(new FileInputStream("C:\\TI3\\Legacy Systemen\\Week 3\\Oefening 3\\inputfile.dat"),
                   java.nio.charset.Charset.forName("ibm500") );
        } catch(FileNotFoundException e){
            e.printStackTrace();
        }
        builder = new StringBuilder();
    }

    public void read() throws IOException {
        int theInt;
        while((theInt = reader.read()) != -1){
            char theChar = (char) theInt;
            builder.append(theChar);

        }

        reader.close();
    }

    @Override
    public String toString(){
        return builder.toString();
    }
}

文件描述如下:

 02 KDGEX.
      05 B1-LENGTH PIC S9(04) USAGE IS COMP.
      05 B1-CODE PIC S9(04) USAGE IS COMP.
      05 B1-NUMBER PIC X(08).
      05 B1-PPR-NAME PIC X(06).
      05 B1-PPR-FED PIC 9(03).
      05 B1-PPR-RNR PIC S9(08) USAGE IS COMP.
      05 B1-DATA.
        10 B1-VBOND PIC 9(02).
        10 B1-KONST.
          20 B1-AFDEL PIC 9(03).
          20 B1-KASSIER PIC 9(03).
          20 B1-DATZIT-DM PIC 9(04).
        10 B1-BETWYZ PIC X(01).
        10 B1-RNR PIC X(13).
        10 B1-BETKOD PIC 9(02).
        10 B1-VOLGNR-INF PIC 9(02).
        10 B1-QUAL-PREST PIC 9(03).
        10 B1-REKNUM PIC 9(12).
        10 B1-REKNR REDEFINES B1-REKNUM.
          20 B1-REKNR-PART1 PIC 9(03).
          20 B1-REKNR-PART2 PIC 9(07).
          20 B1-REKNR-PART3 PIC 9(02).
        10 B1-VOLGNR-M30 PIC 9(03).
        10 B1-OMSCHR.
          15 B1-OMSCHR1 PIC X(14).
          15 B1-OMSCHR2 PIC X(14).
        10 B1-OMSCHR-INF REDEFINES B1-OMSCHR.
          15 B1-AANT-PREST PIC 9(02).
          15 B1-VERSTR PIC 9(01).
          15 B1-LASTDATE PIC 9(06).
          15 B1-HONOR PIC 9(06).
          15 B1-RIJKN PIC X(13).
        10 FILLER--1 PIC 9(02).
        10 B1-INFOREK PIC 9(01).
        10 B1-BEDRAG-EUR PIC 9(08).
        10 B1-BEDRAG-DV PIC X(01).
        10 B1-BEDRAG-RMG-DV REDEFINES B1-BEDRAG-DV PIC X(01).
      05 FILLER PIC X(5).

我们可以忽略每行的前2个字节。问题是,有用法的字节是COMP,因为阅读器没有正确地转换它们,我想我应该把这些读成字节或什么的,尽管我不知道怎么读。

共有1个答案

公孙栋
2023-03-14

如果我正确地解释了这种格式,那么您就有了一种带有固定长度记录的二进制文件格式。其中一些记录不是字符数据(COBOL计算字段?)

因此,您必须使用处理每个记录的单个字段的更低级的方法来读取记录:

import java.io.*;

public class Record {
  private byte[] kdgex = new byte[2]; // COMP
  private byte[] b1code = new byte[2]; // COMP
  private byte[] b1number = new byte[8]; // DISPLAY
  // other fields

  public void read(DataInput data) throws IOException {
    data.readFully(kdgex);
    data.readFully(b1code);
    data.readFully(b1number);
    // other fields
  }

  public void write(DataOutput out) throws IOException {
    out.write(kdgex);
    out.write(b1code);
    out.write(b1number);
    // other fields
  }
}

在这里,我对记录的前三个字段使用了字节数组,但您可以在适当的地方使用其他更合适的类型(比如对第一个字段使用short,其中有readshort。)注:我对字段宽度的解释可能是错误的;这只是一个例子。

DataInputStream通常用作DataInput实现。

由于源编码和目标编码中的所有字符都使用每个代码点一个八位字节,因此应该能够使用如下方法对字符数据字段进行代码转换:

public static byte[] transcodeField(byte[] source, Charset from, Charset to) {
  byte[] result = new String(source, from).getBytes(to);
  if (result.length != source.length) {
    throw new AssertionError(result.length + "!=" + source.length);
  }
  return result;
}

我建议用COBOL标记您的问题(假设这是这种格式的来源),这样其他人就可以更权威地讨论数据源的格式。

 类似资料:
  • 我尝试过使用python 2.6将EBCDIC转换为ASCII,但在这方面存在许多问题,比如压缩字段没有得到转换,记录计数增加。 是否有任何方法转换EBCDIC文件压缩字段到ASCII格式。

  • 我试图将文件从ECDIC转换为ASCII格式,遇到了一个有趣的问题。这些文件包含固定长度的记录,其中一些字段是带符号的二进制整数(在记录布局中描述为B4),以及长精度数值(在记录布局中描述为L8)。我已经能够毫无问题地转换字符数据,但我不确定如何转换这些数值。下面描述了原始系统的参考手册(IBM5110)中的字段。

  • 问题内容: 我应该通过使用Java将EBCDIC文件转换为ASCII。到目前为止,我有以下代码: 文件描述如下: 我们可以忽略每一行的前2个字节。问题是字节存在USAGE IS COMP,因为读者无法正确转换它们,我想我应该将它们读取为字节或其他内容,尽管我不知道如何。 问题答案: 如果我正确地解释了这种格式,则您的二进制文件格式具有固定长度的记录。其中一些记录不是字符数据(COBOL计算字段?)

  • 我们有PHP服务器代码,在iSeries中端执行SQL语句。 以下是SQL查询的简化版本 查询执行得很好,问题是当使用诸如“sometext”“title”这样的静态字段/值时,结果在PHP中返回时,它们不是所需的格式 谢了! 编辑 根据bucks的建议,我们将用户配置文件CCSID更改为37,而不是65535 解决方案是将用户配置文件改为使用CCSID37,并将服务器作业改为使用CCSID37。