2

http://www.2shared.com/document/VqlJ-1wF/test.html

1) What is the encoding w/ which this file is encoded ? 2) What's the best way to read this in Java ?

Currently I have

Scanner scanner = new Scanner(new File("test.txt"), "IBM850");
while (scanner.hasNextLine()) {
buffer = new StringBuffer(scanner.nextLine());
System.out.println("BUFFER = "+buffer.toString());
}

Prints a lot of nulls and garbage. Whats the right encoding I need to use?

4

5 回答 5

2

我在 PC 和 IBM 中端系统之间移动数据方面拥有丰富的经验。我可以说该文件绝对不是(纯)EBCDIC。每个“行”的开头是ASCII字符:

CODE12312345678901502G830918

任何 EBCDIC 字符匹配该序列的可能性,更不用说所有三行上的相同序列是无限小的。

我最好的选择是带有二进制数据的 ASCII 引导(或已经翻译的 EBCDIC)。如果它已被翻译,则几乎可以肯定二进制部分已损坏。

在我用十六进制检查后不久,我可能会得到更多信息。

每个“记录”用十六进制 0D 0A 0D 0A 分隔,它们是一对 CRLF 序列。

我认为您很可能有一个固定字段平面文件格式,其中文本字段为 ASCII,其他字段为二进制。

于 2011-03-08T18:30:42.690 回答
1

从外观上看,您已经获取了一个二进制大型机文件,并在将其传输到 PC 时对其进行了 ascii 转换。这行不通。

为了说明出现了什么问题,考虑一个值为 64 (X'0040') 的 2 字节二进制整数字段,它将转换为 32 (x'0020'),因为 x'40' 也是空格字符的 EBCIDIC;ascii 转换器会将所有 EBCIDIC 空间转换为 ascii 空间 (x'20')。您真的希望保留二进制和压缩十进制字段。

您有 2 个选项:

  1. 将所有 Comp3 / 二进制字段转换为大型机上的文本(Cobol / sort / easytrieve 等可以做到这一点)。然后进行转账
  2. 向 PC 进行二进制传输,然后编写程序来读取文件。java包JRecord(http://jrecord.sourceforge.net/)可以读写Mainframe文件
  3. 进行二进制传输并使用 RecordEditor ( http://record-editor.sourceforge.net/Record04.htm ) 之类的实用程序来读取它。recordEditor 可以读取大型机文件并将它们保存为 CSV 或定宽 ascii 文件。RecordEditor 可以使用 Cobol Copybook 来查看文件。

我可以告诉您的是,该文件在大型机上的长度为 2000 字节,并且包含许多 Packed-Decimal 字段(Cobol Comp-3)。

我已经解码了第一条记录的前 120 个字节:

Field     start     length   Value                    Hex Representation
n0        1         4        CODE                     434f4445        
n1        5         17       12312345678901502        3132333132333435363738393031353032       
n2        22        1        G                        47        
n3        23        6        830918                   383330393138        
n4        29        1        V                        56        
n5        30        3        2470                     02470f        
n6        33        4        0                        0000000f        
n7        37        3        2470                     02470f        
n8        40        2        09                       3039        
n9        42        5        290502                   000290502c        
n10       47        5        10842                    000010842c        
n11       52        5        279660                   000279660c        
n12       57        5        19072                    000019072c        
n13       62        5        11488                    000011488c        
n14       67        5        0                        000000000c        
n15       72        4        0                        0000000c        
n16       76        4        0                        0000000c        
n17       80        7        439914                   0000000439914c        
n18       87        7        0                        0000000000000c        
n19       94        7        0                        0000000000000c        
n20       101       4        7588                     0007588c        
n21       105       4        7588                     0007588c        
n22       109       4        0                        0000000c        
n23       113       4        0                        0000000c        
n24       117       5        0                        000000000c        

Where: 
Start  - Field start (byte number)
length - Field length (in bytes)
Value  - Field value
Hex representation - How the field is stored in the file in hex
于 2011-03-12T12:20:24.770 回答
1

它绝对不是 EBCDIC 编码的(我在 70 年代和 80 年代都在 IBM 大型机上工作,所以我认识 EBCDIC :-)。它似乎是带有一些二进制组件的 ASCII。正确解释这一点的唯一方法是提供者为您提供描述每种记录类型(可能有一种或多种记录类型)并指示嵌入二进制对象的数据类型的映射。

于 2011-03-08T18:27:58.517 回答
1

通常,IBM 大型机数据存储在一种区域风格的字符编码 中,例如美国的 Cp437 或多语言 Cp870。

于 2011-03-08T18:20:54.170 回答
0

使用 cp1047 字符集,如下所示。

BufferedReader br = new BufferedReader(new InputStreamReader(InputStream, "cp1047" ));

于 2018-08-28T18:26:23.123 回答