Java :Преобразование строки в упакованное десятичное число

новенький тут!

Ситуация :Я работаю над проектом, который должен взаимодействовать с сервером AS/400. Моя задача состоит в том, чтобы в основном обрабатывать запросы, которые будут отправлены на сервер AS/400. Для этого весь пользовательский ввод должен быть в байтах EDCDIC.

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

public class PackedDecimal {
    public static long parse(byte[] pdIn) throws Exception {
        // Convert packed decimal to long
        final int PlusSign = 0x0C; // Plus sign
        final int MinusSign = 0x0D; // Minus
        final int NoSign = 0x0F; // Unsigned
        final int DropHO = 0xFF; // AND mask to drop HO sign bits
        final int GetLO = 0x0F; // Get only LO digit
        long val = 0; // Value to return

        for (int i = 0; i < pdIn.length; i++) {
            int aByte = pdIn[i] & DropHO; // Get next 2 digits & drop sign bits
            if (i == pdIn.length - 1) { // last digit?
                int digit = aByte >> 4; // First get digit
                val = val * 10 + digit;
                // System.out.println("digit=" + digit + ", val=" + val);
                int sign = aByte & GetLO; // now get sign
                if (sign == MinusSign)
                    val = -val;
                else {
                    // Do we care if there is an invalid sign?
                    if (sign != PlusSign && sign != NoSign)
                        throw new Exception("OC7");
                }
            } else {
                int digit = aByte >> 4; // HO first
                val = val * 10 + digit;
                // System.out.println("digit=" + digit + ", val=" + val);
                digit = aByte & GetLO; // now LO
                val = val * 10 + digit;
                // System.out.println("digit=" + digit + ", val=" + val);
            }
        }
        return val;
    } // end parse()
      // Test the above

    public static void main(String[] args) throws Exception {
        byte[] pd = new byte[] { 0x19, 0x2C }; // 192
        System.out.println(PackedDecimal.parse(pd));
        pd = new byte[] { (byte) 0x98, 0x44, 0x32, 0x3D }; // -9844323
        System.out.println(PackedDecimal.parse(pd));
        pd = new byte[] { (byte) 0x98, 0x44, 0x32 }; // invalid sign
        System.out.println(PackedDecimal.parse(pd));
    }
}

Теперь моя проблема заключается в том, что мне нужно снова преобразовать эти строковые значения в байты EBCDIC, чтобы сервер AS/400 их понял. Я планирую сделать что-то вроде построения запроса (необработанных байтов )с использованием формата, указанного в документации Silverlake. Как только запрос будет создан, я планирую вручную изменить значения внутри этого запроса, используя POJO, в котором хранится мой запрос (с сеттерами и геттерами ), чтобы я мог просто пойти как request.setField1("Stuff".getBytes(Charset.forName("Cp1047"))).

У меня нет такого большого опыта работы с битами, байтами и кусочками. Я надеюсь, что кто-то может мне помочь.

В нашем коде мы нашли упакованное десятичное число, состоящее из 5 байтов. Это выглядит примерно так = {00 00 00 00 0F}. Я преобразовал это, используя метод, который я получил из кода выше, и значение, которое я получил, было 0. Теперь я хотел бы преобразовать этот 0 обратно в его исходную форму с исходным размером байта 5.

5
задан jamesallman 26 June 2012 в 15:45
поделиться