Как преобразовать данные int в упакованный десятичный код в Java - PullRequest
0 голосов
/ 07 июня 2019

Я работаю над кодом Java, мне нужно преобразовать данные int в упакованный десятичный код в Java.Потому что упакованный десятичный формат - это старый формат (COBOL).Решения, которые я нашел, имели дело с преобразованием int в упакованный десятичный код, но не с плавающей точкой.У меня есть две переменные: длина и количество чисел после десятичной запятой должны храниться как упакованные десятичные числа.

например: length = 6(in half a byte)

Это означает, что total length=3 bytes+1/5 byte+1/5 byte(To get even number of bytes) Количество грызунов послесохраненная десятичная точка = 2

(Unsigned) 12345.67 >> 1234567F

в случае, если количество кусочков = 4

(Unsigned) 12345.67 >> 3456700F

Любой код будет высоко оценен.

1 Ответ

1 голос
/ 07 июня 2019

Вот пример из этого поста , предоставленный @GilbertLeBlanc, который должен исправить решение вашей проблемы.

public class PackedDecimal {

    public static byte[] format(long number, int bytes) {
        byte[] b = new byte[bytes];

        final byte minusSign = 0x0D; // Minus
        final byte noSign = 0x0F; // Unsigned

        String s = Long.toString(number);
        int length = s.length();
        boolean isNegative = false;

        if (s.charAt(0) == '-') {
            isNegative = true;
            s = s.substring(1);
            length--;
        }

        int extraBytes = length - bytes + 1;

        if (extraBytes < 0) {
            // Pad extra byte positions with zero
            for (int i = 0; i < -extraBytes; i++) {
                b[i] = 0x00;
            }
        } else if (extraBytes > 0) {
            // Truncate the high order digits of the number to fit
            s = s.substring(extraBytes);
            length -= extraBytes;
            extraBytes = 0;
        }

        // Translate the string digits into bytes
        for (int i = 0; i < length; i++) {
            String digit = s.substring(i, i + 1);
            b[i - extraBytes] = Byte.valueOf(digit);
        }

        // Add the sign byte
        if (isNegative) {
            b[bytes - 1] = minusSign;
        } else {
            b[bytes - 1] = noSign;
        }

        return b;
    }

    public static void main(String[] args) {
        long number = -456L;
        byte[] b = PackedDecimal.format(number, 5);
        System.out.println("Number: " + number + ", packed: " + byteToString(b));

        number = 0L;
        b = PackedDecimal.format(number, 5);
        System.out.println("Number: " + number + ", packed: " + byteToString(b));

        number = 5823L;
        b = PackedDecimal.format(number, 5);
        System.out.println("Number: " + number + ", packed: " + byteToString(b));

        number = 123456L;
        b = PackedDecimal.format(number, 5);
        System.out.println("Number: " + number + ", packed: " + byteToString(b));
    }

    public static String byteToString(byte[] b) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < b.length; i++) {
            sb.append("0x");
            sb.append(Integer.toHexString((int) b[i]).toUpperCase());
            sb.append(" ");
        }
        return sb.toString();
    }

}

Результаты теста по основному методу приведены ниже:

Number: -456, packed: 0x0 0x4 0x5 0x6 0xD 
Number: 0, packed: 0x0 0x0 0x0 0x0 0xF 
Number: 5823, packed: 0x5 0x8 0x2 0x3 0xF 
Number: 123456, packed: 0x3 0x4 0x5 0x6 0xF
...