Вставьте байт в ячейку 0 и сдвиньте вправо оставшиеся биты данных

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

  1. Я работаю над уровнем ISO 8583, и элемент данных 32 определяется как n ..11, что означает элемент числовой, переменной длины с максимальным размером 11.

  2. и это нужно отправить в двоичном формате (не ASCII).

  3. Нам нужно показать LLNN, исходный двоичный файл ISO должен выглядеть так: 11 06 01 04 00 00 00

До сих пор мне удавалось заполнить массив byte[] размером (11/2)+(11%2) 6 с помощью BCD(06 01 04 00 00 00). и я получил общую длину поля, рассчитанную как 11. Теперь мне нужно вставить это в байт [0] с 11, а не 0B, то есть 0001 0001, упакованным в один байт byte[]as 11, моя логика, как показано ниже, когда я даю nBytes=1 (первые 255 символов в BCD ISO) он вставит значение поля длины либо как 0b 01 04 00 00 00, либо если я передам nBytes как 2, это даст 00 0b 04 00 00 00. Что-то не так с правильной логикой сдвига. .

Может ли кто-нибудь помочь мне и исправить эту приведенную ниже логику, чтобы получить результаты как 11 06 01 04 00 00 00

int nBytes=1;
for (int i = nBytes - 1; i >= 0; i--) {
    buf[i] = (byte)(length & 0xFF);
    length >>= 8;
}
outstream.write(buf);

person pathfinder    schedule 11.12.2012    source источник
comment
Почему ты вообще немного меняешь положение? Разве вы не можете просто создать байты, необходимые для отправки сообщения ISO 8583? Добавьте байт, содержащий 11 шестнадцатеричных или 17 десятичных знаков, и добавьте его к другим байтам.   -  person Gilbert Le Blanc    schedule 11.12.2012
comment
@Gilbert: Спасибо, что вернули Гилберта, я могу, подумал, чтобы избежать создания нескольких объектов массива ... если можно позаботиться о правом сдвиге, то это было бы здорово ... Я реализовал решение на основе вашего ввода ... просто проверяю на стороне хоста, чтобы увидеть, правильно ли он декодирует ... Я скоро сообщу вам, как прошло это новое исправление ..   -  person pathfinder    schedule 12.12.2012
comment
@Gilbert: 17-й десятичный способ отлично работал в системе ISO .... Спасибо за мысль ..   -  person pathfinder    schedule 12.12.2012
comment
Не могли бы вы объяснить 11 06 01 04 00 00 00? И что подразумевается под (11/2)+(11%2)?, а также что означает nBytes? Кроме того, каково содержание buf[] заранее?   -  person Micha Wiedenmann    schedule 14.12.2012


Ответы (2)


Я думаю, что эта функция выполняет преобразование BCD, которое вы ищете:

class T {
    public static byte toBCD(int n)
    {
        // a*10 + b -> a*16 + b;
        byte a = (byte)(n / 10);
        byte b = (byte)(n % 10);

        return (byte) (a * 0x10 + b);
    }

    public static void main(String[] args)
    {
        assert(toBCD(11) == 0x11);
        assert(toBCD(28) == 0x28);
    }
}
person Micha Wiedenmann    schedule 14.12.2012

Я, наконец, закончил использовать объекты двухбайтового массива. Один содержит исходный запрос и вычисляет длину поля в десятичном виде и помещает его в первое место, то есть 0 индекс вторичного массива байтов, и добавляет к нему исходный массив байтов.

person pathfinder    schedule 21.12.2012