Как декодировать сжатые поля comp 3 в файл ascii, используя java? - PullRequest
0 голосов
/ 10 декабря 2018

У меня огромный файл мэйнфрейма, извлеченный из устаревшей системы.Файл закодирован в формате 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;
    }    
}

1 Ответ

0 голосов
/ 10 декабря 2018

Комментарий в вашем коде неверный.У упакованных данных с положительным знаком в последнем клеве есть x'A ', x'C', x'E 'или x'F'.У мэйнфреймов также есть понятие «предпочтительный знак», который представляет собой x'C 'в последнем кусочке для положительного и x'D' в последнем кусочке для отрицательного.

Обычно данные мэйнфреймов включают в одну запись как текстовые, так и двоичные данные, например, имя, сумму валюты и количество:

Hopper Grace ar% .

... что будет ...

x'C8969797859940404040C799818385404040404081996C004B'

... в гексагоне.Это кодовая страница 37, обычно называемая EBCDIC.

Не зная, что фамилия ограничена первыми 10 байтами, данное имя ограничено последующими 10 байтами, сумма валюты указана в упакованном десятичном формате (также известном как двоично-десятичный код) в следующих 3 байтах.и количество в следующих двух байтах, вы не можете точно передать данные, потому что преобразование кодовой страницы уничтожит сумму валюты.При преобразовании в кодовую страницу 1250, обычно используемую в Microsoft Windows, вы получите ...

x'486F707065722020202047726163652020202020617225002E'

... где текстовые данные переведены, но упакованные данныеуничтожены.Упакованные данные больше не имеют действительного знака в последнем полубайте (нижняя половина последнего байта), сама сумма валюты была изменена так же, как и количество (с десятичного 75 на десятичное 11 776 из-за преобразования кодовой страницы и искажениябольшой порядковый номер как порядковый номер).

На этот вопрос есть несколько ответов, которые могут вам помочь.Моя рекомендация состоит в том, чтобы преобразовать все данные в мэйнфрейм в текст до их переноса на другую платформу.В этом есть превосходные утилиты для мэйнфреймов.

...