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

无法在java中将comp 3解压缩为numeric

终子昂
2023-03-14
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;
    }    
}

转换后,我得到的解压缩数据为783031394

共有1个答案

鲜于光辉
2023-03-14

您可以使用IBM Record Generator for Java这一免费工具。

这允许您生成一个表示COBOL或PL/I DSECT的Java类,然后您可以在自己的代码中使用它来读/写大多数COBOL和PL/I数据类型的值。如果您不使用结构,那么您可以通过代码看到底层JZOS类是如何与DataType交互的。

虽然该工具是免费的,但它受到IBM的支持,所以如果遇到问题,可以向IBM提出问题,他们会解决的。

 类似资料:
  • 我有一个从遗留系统中提取的大型机文件。该文件以ascii格式编码。我想把它转换成Comp3。java中有什么算法可以做到这一点吗?另外,我需要帮助如何解压缩comp3字段。我试着用java代码解压缩comp3,但是我发现了不正确的结果 请参考解压缩comp3字段的代码

  • 问题内容: 我知道这是一项容易的任务,但是更改代码后它停止工作,并且无法恢复!我实际上使用了两个函数来进行压缩和解压缩,尽管实际上它是“ jar”和“ unjar”,但这并没有太大的区别 任何帮助/建议吗? 创建JarFile时发生错误: 问题答案: 我不知道这是否是您的问题,但是通常最好在完成写入后关闭每个zip条目。 请参阅。 在显示的代码中,不会关闭邮政编码中的最后一个条目。您也不会显示关闭

  • 问题内容: 任何人都可以向我展示在我一直在搜索的Java中压缩和解压缩tar.gzip文件的正确方法,但是我能找到的最多是zip或gzip(单独)。 问题答案: 我最喜欢的是plexus-archiver-请参阅GitHub上的资源。 另一个选项是Apache commons- compress- (请参阅mvnrepository)。 使用plexus-utils,用于取消存档的代码如下所示:

  • 问题内容: 我想将普通文件压缩为.zip,然后将其压缩为gzip文件,而不创建新文件。 例如,假设我有一个pdf文档 doc.pdf ,我必须得到的是: 我不想创建一个名为的新文件,然后将其打开并gzip。 我正在与服务器一起从浏览器获取文件并将其返回,这是我的功能: 我得到了一个文件,但是它有一个损坏的文件并且没有压缩,为什么? 问题答案: 我认为您可以为zip创建一个临时文件,将其添加到gzi

  • OS-X 优胜美地 目标-C 压缩视频输入(AVCaptureDeviceFormat=='muxx'/'isr') 压缩视频流作为支持“muxx/isr”有效载荷格式的HAL捕获设备(AVCaptureDevice)暴露于操作系统,我希望能够直接访问压缩有效载荷的原始字节(不解压)。 使用“+(AVCaptureDevice*)DeviceWithUniqueID:(NSString*)Devi

  • 问题内容: 我正在尝试解压缩一些zip文件,它的大小约为65兆。下面的代码段: 此方法实际上将文件解压缩: 那个执行者/未来的东西只是为了确保我正确地做。在类Finder中调用此方法,该类在目录中查找zip文件并尝试将其解压缩。它基于此代码http://docs.oracle.com/javase/tutorial/essential/io/walk.html 具体来说: 现在的问题。真的很有趣。