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