我在Internet上引用了一个代码,将comp 3解压缩为Java中的数字。我试图将示例comp3文件传递给代码,但没有得到正确的解压缩数据。我有一些奇怪的数字。我是这个概念的新手(comp 3),所以你们可以帮我这个忙。预先感谢
下面是我的代码
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Converts between integer and an array of bytes in IBM mainframe packed
* decimal format. The number of bytes required to store an integer is (digits +
* 1) / 2. For example, a 7 digit number can be stored in 4 bytes. Each pair of
* digits is packed into the two nibbles of one byte. The last nibble contains
* the sign, 0F for positive and 0C for negative. For example 7654321 becomes
* 0x76 0x54 0x32 0x1F.
*
* This class is immutable. Once constructed you can extract the value as an
* int, an array of bytes but you cannot change the value. Someone should
* implement equals() and hashcode() to make this thing truly useful.
*/
public class PackedDecimalToComp {
public static void main(String[] args) {
try {
// test.unpackData(" 0x12345s");
Path path = Paths.get("C:\\Users\\AV00499269\\Desktop\\Comp3 data file\\Comp3Test.txt");
byte[] data = Files.readAllBytes(path);
PackedDecimalToComp test = new PackedDecimalToComp();
test.unpackData(data);
} catch (Exception ex) {
System.out.println("Exception is :" + ex.getMessage());
}
}
private static String unpackData(byte[] packedData) {
String unpackedData = "";
final int negativeSign = 13;
for (int currentCharIndex = 0; currentCharIndex < packedData.length; currentCharIndex++) {
byte firstDigit = (byte) ((packedData[currentCharIndex] >>> 4) & 0x0F);
byte secondDigit = (byte) (packedData[currentCharIndex] & 0x0F);
unpackedData += String.valueOf(firstDigit);
if (currentCharIndex == (packedData.length - 1)) {
if (secondDigit == negativeSign) {
unpackedData = "-" + unpackedData;
}
} else {
unpackedData += String.valueOf(secondDigit);
}
}
System.out.println("Unpackeddata is :" + unpackedData);
return unpackedData;
}
}
我传递的Comp3文件的值为x019F
转换后,我得到的解压缩数据为783031394
答案 0 :(得分:2)
您可以使用免费工具IBM Record Generator for Java。
这允许您生成表示COBOL或PL / I DSECT的Java类,然后可以在自己的代码中使用该Java类来读取/写入大多数COBOL和PL / I数据类型的值。如果您不使用结构,则可以通过代码查看如何使用底层JZOS类与数据类型进行交互。
尽管该工具是免费的,但它受IBM支持,因此,如果您遇到问题,可以向IBM提出问题,他们将予以解决。
答案 1 :(得分:0)
您有2个选择:
我还看到大型机上的文件已转换为Unix EBCDIC文本文件,以及二进制传输文件(保持为EBCDIC)。对于具有特殊语言特定字符的非英语EBCDIC,此操作可以完成。 Java编辑器(例如JEdit)可以轻松编辑Unix Ebcdic文件
要将二进制文件(具有comp,comp-3等)从大型机传输到 在Windows / * nix框中,您必须执行 Binary Transfer (二进制传输),原因很简单:Ebcdic-> Ascii程序无法区分二进制字段和Text字段。
Comp-3 value hex hex after Ascii conversion
400 x'400c' x'200c' x'40' is the ebcdic space character
it gets converted to the ascii
space character x'20'
您需要从大型机进行二进制传输。这将使文件保持为EBCDIC,所有二进制字段都将保持不变。然后,您使用Ebcdic读取文件。
您将需要检查大型机上的 RECFM 。如果 RECFM 是
您需要定义记录布局(或文件架构)。最简单的方法是导入Cobol Copybook。
对于2字节的comp-3字段,请创建具有以下内容的cobol抄写本
01 Tst-Record.
03 comp3-field pic s9(3) comp-3.
要导入cobol抄写本,请选择记录布局>>>加载Cobol抄写本
然后输入 Cobol抄写本文件名,然后按屏幕底部的 load Cobol 按钮
接下来进入文件打开屏幕,输入文件名,然后选择刚导入的副本:
按Enter,您应该可以更新文件:
RecordEditor 也可以为JRecord Library生成代码。参见How do you generate java~jrecord code for a Cobol copybook,了解如何使用Cobol Copybook生成Java〜JRecord代码。
您还可以在编辑文件时生成不使用Cobol Copybook的代码:
从文件选项中选择生成>>>生成代码。然后选择一个模板并输入包裹ID