3 votes

Insérer l'octet à l'emplacement 0 et décaler vers la droite les bits de données restants

J'ai vraiment du mal à terminer cette pièce, toute réflexion ou indication m'aiderait beaucoup. Voici mon problème :

  1. Je travaille sur ISO 8583 et l'élément de données 32 est défini comme n ..11, ce qui signifie que l'élément est numérique, de longueur variable avec une taille maximale de 11.

  2. et ces données doivent être envoyées en format binaire (et non ASCII).

  3. Nous devons montrer LLNN, ex ISO binary raw devrait ressembler à ceci : 11 06 01 04 00 00 00

Jusqu'à présent, j'ai pu remplir le tableau byte[] avec (11/2)+(11%2) taille de 6 avec BCD(06 01 04 00 00 00). et j'ai obtenu la longueur totale du champ calculée comme 11, Maintenant j'ai besoin d'insérer ceci à byte[0] avec le 11 pas 0B i.e 0001 0001 emballé à un octet. byte[] Comme 11, ma logique est la suivante : lorsque je donne nBytes=1 (255 premiers caractères dans BCD ISO), il insère la valeur du champ longueur soit 0b 01 04 00 00 00 ou si je passe nBytes à 2, il donne 00 0b 04 00 00 00. Il y a quelque chose qui ne va pas avec la logique de décalage vers la droite...

Quelqu'un peut-il m'aider à corriger la logique ci-dessous pour que les résultats soient 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);

0voto

Micha Wiedenmann Points 3357

Je pense que cette fonction effectue la conversion BCD que vous recherchez :

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);
    }
}

0voto

pathfinder Points 51

J'ai fini par utiliser les objets de type tableau à deux octets. L'un contient la requête originale et calcule la longueur du champ en décimal et la place dans le premier emplacement, c'est-à-dire l'index 0 du tableau secondaire et y ajoute le tableau original.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X