Невозможно распаковать комп 3 в числовой форме в Java - PullRequest
0 голосов
/ 06 декабря 2018

Я сослался на код в интернете, чтобы распаковать комп 3 в числовой форме в Java.Я попытался передать пример файла comp3 в код, но я не получил правильные распакованные данные.У меня есть странные цифры.Я новичок в этой концепции (аккомпанемент 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

Ответы [ 2 ]

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

Обработка двоичного файла мэйнфрейма

У вас есть 2 варианта:

  • Преобразовать файл в текстовый файл на мэйнфрейме, а затем передать файл
  • Сделатьдвоичную передачу и сохраните файл как EBCDIC, затем используйте что-то вроде JRecord для чтения файла.Вы также можете использовать RecordEditor для редактирования файла

Я также видел файлы, преобразованные в текстовые файлы Unix EBCDIC на мэйнфрейме и двоичную передачу (сохранить как EBCDIC).Это сделано для не английского языка EBCDIC, где у вас есть специальные символы для конкретного языка.Редакторы Java (например, JEdit) без проблем редактируют файлы Unix Ebcdic

Передача файлов (мэйнфрейм)

Для передачи файла Binary (имеет comp, comp-3 и т. Д.)из мэйнфрейма в окно Windows / * nix вы должны выполнить Binary Transfer по очень простой причине: программа Ebcdic -> Ascii не может различить двоичные поля и текстовые поля.

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 равен

  • FB - нет проблем, просто переведите
  • VB - либо преобразуйте в FB намэйнфрейм включает в передачу файла RDW (Слово дескриптора записи) .
  • Прочее - Преобразование в FB / VB на мэйнфрейме

RecordEditor

  • Убедитесь, что у вас установлена ​​ Java
  • Вы можете получить RecordEditor из здесь .Вы можете скачать установщик или версию USB.USB-версия представляет собой ZIP-каталог, который можно установить в любой обычный каталог.

Использование редактора записей

Вам необходимо определить Layout Layout (илисхема файла).Самый простой способ - импортировать тетрадь Cobol.

Для 2-байтового поля comp-3 создайте тетрадь cobol с

        01  Tst-Record.
            03  comp3-field              pic s9(3) comp-3.

Чтобы импортировать тетрадь cobol Выберите Record Layouts>>> Загрузить тетрадь Cobol

Cobol import

Затем введите Имя файла тетради Cobol и нажмите loadКнопка Cobol в нижней части экрана

enter image description here

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

enter image description here

Нажмите Enter, и вы сможете обновить файл:

enter image description here

Генерация кода

RecordEditor также может генерировать код для JRecord Library .См. Как сгенерировать код java ~ jrecord для тетради Cobol для быстрого создания кода Java ~ JRecord с использованием тетради Cobol.

Вы также можете сгенерировать код, который не использует тетрадь Cobolпри редактировании файла:

Выберите Создать >>> Создать код из файла .Затем выберите шаблон и введите идентификатор пакета

enter image description here

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

Вы можете использовать IBM Record Generator для Java , бесплатный инструмент.

Это позволяет вам генерировать Java-класс, который представляет COBOL или PL / I DSECT, который вы затем можете использовать в своем собственном коде для чтения / записи значений для большинства типов данных COBOL и PL / I.Если вы не работаете со структурой, вы можете увидеть в коде, как базовые классы JZOS используются для взаимодействия с типом данных.

Хотя инструмент бесплатный, он поддерживаетсяIBM, поэтому, если вы столкнетесь с проблемой, вы можете поднять проблему с IBM, и они ее исправят.

...