Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用java解码ascii文件中的comp 3压缩字段?_Java_Cobol - Fatal编程技术网

如何使用java解码ascii文件中的comp 3压缩字段?

如何使用java解码ascii文件中的comp 3压缩字段?,java,cobol,Java,Cobol,我有一个从遗留系统中提取的大型机文件。该文件以ascii格式编码。我想把它转换成comp3。java中有什么算法可以做到这一点吗?此外,我还需要有关如何解压缩comp3字段的帮助。我尝试用java代码解包comp3,但发现结果不正确 请参阅代码以解压缩comp3字段 import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; /**

我有一个从遗留系统中提取的大型机文件。该文件以ascii格式编码。我想把它转换成comp3。java中有什么算法可以做到这一点吗?此外,我还需要有关如何解压缩comp3字段的帮助。我尝试用java代码解包comp3,但发现结果不正确

请参阅代码以解压缩comp3字段

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.
 **/ 


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;
    }    
}
import java.math.biginger;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
/**
*在IBM大型机中,在整数和字节数组之间进行转换
*十进制格式。存储整数所需的字节数为(位数)+
* 1) / 2. 例如,7位数字可以存储在4个字节中。每双
*数字被压缩到一个字节的两个半字节中。最后一个字节包含
*符号,0F表示正,0C表示负。例如,7654321变为
*0x76 0x54 0x32 0x1F。
**/ 
公共类PackedDecimalToComp{
公共静态void main(字符串[]args){
试一试{
//测试数据(“0x12345s”);
Path Path=Path.get(“C:\\Users\\AV00499269\\Desktop\\Comp3数据文件\\Comp3Test.txt”);
字节[]数据=文件。readAllBytes(路径);
PackedDecimalToComp测试=新PackedDecimalToComp();
试验数据(数据);
}捕获(例外情况除外){
System.out.println(“异常为:+ex.getMessage());
}    
}
私有静态字符串数据(字节[]packedData){
字符串unpaceddata=“”;
最终整数负设计=13;
对于(int currentCharIndex=0;currentCharIndex>>4)和0x0F);
字节第二位=(字节)(packedData[currentCharIndex]&0x0F);
UnpacketData+=字符串.valueOf(第一位数字);
如果(currentCharIndex==(packedData.length-1)){
如果(第二位数==负设计){
unpaceddata=“-”+unpaceddata;
}
}否则{
UnpacketData+=字符串.valueOf(第二位数字);
}
}
System.out.println(“unpaceddata是:“+unpaceddata”);
返回未解压缩的数据;
}    
}

代码中的注释不正确。带有正号的压缩数据在最后一个半字节中有x'a',x'C',x'E'或x'F'。大型机还有一个“首选符号”的概念,即在最后一个半字节中x'C'表示正,在最后一个半字节中x'D'表示负

大型机数据通常在单个记录中同时包含文本和二进制数据,例如名称、货币金额和数量:

ar%。

…这将是

x'C8969797859940404040400C799818385404040404040400081996C004B'

…用十六进制。这是代码页37,通常称为EBCDIC

在不知道姓氏限制在前10个字节的情况下,给定名称限制在随后的10个字节中,货币金额在接下来的3个字节中以压缩十进制(也称为二进制编码十进制)表示,数量在接下来的两个字节中表示,您无法准确传输数据,因为代码页转换将破坏货币金额。转换到通常在Microsoft Windows上使用的代码页1250,您将得到

x'486F70706722020200477261636552020202020061722002E'

…文本数据被翻译,但压缩数据被销毁。压缩数据在最后一个半字节(最后一个字节的下半部分)中不再有有效符号,货币金额本身也随着数量的变化而变化(由于代码页转换和将大端数字变为小端数字,从十进制75变为十进制11776)


有一些答案可能对你有所帮助。我的建议是,在将数据传输到另一个平台之前,在大型机上将所有数据转换为文本。有一些大型机实用程序在这方面非常出色。

代码中的注释不正确。带有正号的压缩数据在最后一个半字节中有x'a',x'C',x'E'或x'F'。大型机还有一个“首选符号”的概念,即在最后一个半字节中x'C'表示正,在最后一个半字节中x'D'表示负

大型机数据通常在单个记录中同时包含文本和二进制数据,例如名称、货币金额和数量:

ar%。

…这将是

x'C8969797859940404040400C799818385404040404040400081996C004B'

…用十六进制。这是代码页37,通常称为EBCDIC

在不知道姓氏限制在前10个字节的情况下,给定名称限制在随后的10个字节中,货币金额在接下来的3个字节中以压缩十进制(也称为二进制编码十进制)表示,数量在接下来的两个字节中表示,您无法准确传输数据,因为代码页转换将破坏货币金额。转换到通常在Microsoft Windows上使用的代码页1250,您将得到

x'486F70706722020200477261636552020202020061722002E'

…文本数据被翻译,但压缩数据被销毁。压缩数据在最后一个半字节(最后一个字节的下半部分)中不再有有效符号,货币金额本身也随着数量的变化而变化(由于代码页转换和将大端数字变为小端数字,从十进制75变为十进制11776)


有一些答案可能对你有所帮助。我的建议是,在将数据传输到另一个平台之前,在大型机上将所有数据转换为文本。有一些大型机实用程序在这方面非常出色。

正如你提到的,你能告诉我有什么实用程序可以做到这一点吗?@Ashwinivijaykumar main