Нужен Java Code / Logic для извлечения COMP. поле из файла EBCDIC - PullRequest
0 голосов
/ 17 апреля 2019

Требуется Java-код или логика для распаковки COBOL COMP.поле из файла EBCDIC.Пожалуйста, помогите

Я попробовал приведенный ниже код для распаковки комп.Но некоторая ценность, которую я получаю, отрицательна.Ex.8188 мы получаем как -57348

public static String getBinary(byte[] b,int decimalPointLocation) {
    long val = 0;
    int first_byte = b[0] & 0x0F;
    for (int i = 0; i < b.length; i++) {
        int low = b[i] & 0x0F;
        int high = (b[i] >> 4) & 0x0f;
        if (low < 0)
            low *= -1;
        if (high < 0)
            high *= -1;
        if(first_byte==15){
            high = 15 -high;
            low = 15 - low;
        }
        int num = high * 16 + low;
        val = 256 * val + num;
    }
    if(first_byte == 15){
        val++;
    }
    String s = ""+val;
    while(s.length()<b.length*2){
        s="0"+s;
    }
    if(first_byte == 15){
        s="-"+s;
    }
    if (decimalPointLocation > 0) {
        s = s.substring(0,
                (s.length() - decimalPointLocation))
                + "."
                + s.substring(s.length()
                        - decimalPointLocation);
    }
    return s;
}

1 Ответ

2 голосов
/ 18 апреля 2019

Я не использую Java, но я постараюсь объяснить, что происходит.

Значение 8188 равно 0x1ff8 в шестнадцатеричном гексе. Когда ваша программа запущена, результат на самом деле 8188 - 65536 = -57348. Вот почему вы получили результат, который вы сделали.

Поскольку входные данные являются двоичными числами с прямым порядком байтов, только первый бит b[0] должен проверяться на наличие знака. То, что я сделал в C #, было:

    public static String GetBinary(byte[] b, int decimalPointLocation)
    {
        long val = 0;
        if ((b[0] & 0x80) != 0)
        {
            val = -1;
        }
        for (int i = 0; i < b.Length; i++)
        {
                val = (val << 8) + b[i];
        }
        string s = Convert.ToString(val);
        return s;
    }

Для byte[] b = {0x1f, 0xfc} возвращаемое значение равно 8188. Для byte[] b = {0xe0, 0x04} возвращаемое значение равно -8188.

Хотя я использовал аналогичные операции с подстрокой для вставки десятичной точки для этих значений, вы должны знать, что абсолютные целочисленные значения меньше 100 не могут быть должным образом отформатированы для двух десятичных знаков с помощью этого метода.

...