2 votes

Comment obtenir un tableau d'octets non signés à partir d'un BigInteger en Java ?

Je dois convertir un BigInteger en un entier non signé encodé au format big-endian, mais j'ai des problèmes car [BigInteger.toByteArray](https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#toByteArray()) renvoie une représentation signée. Comment puis-je convertir cette valeur en un format non signé ?

Un contexte (relativement) utile

Je travaille sur un code qui utilise JNI pour que c++ appelle certaines méthodes Java afin de gérer certaines fonctionnalités cryptographiques (il s'agit d'un fournisseur CNG de Microsoft qui décharge certaines fonctionnalités vers Java). J'ai la clé publique en Java et les valeurs BigInteger que je dois convertir sont les suivantes [coordonnées de la clé publique de la courbe elliptique](https://docs.oracle.com/javase/7/docs/api/java/security/spec/ECPoint.html#getAffineX()) . Selon le Documentation sur le GNC Je dois fournir ces points en tant qu'"entiers non signés encodés au format big-endian".

Modifier

Rétrospectivement, c'était peut-être un message stupide. Je m'embrouillais avec les nombres négatifs et positifs et la façon de gérer cela (et parce qu'il est tard et que mon esprit s'est transformé en bouillie). les points de la courbe elliptique ne seront pas négatifs . Merci à tous ceux qui ont répondu ici ! Je vais laisser ce message au cas où il aiderait quelqu'un d'autre.

1voto

Jekin Kalariya Points 334

Avec l'aide d'une valeur de référence en complément à 2, nous pouvons le faire comme suit

private static final BigInteger TWO_COMPL_REF = BigInteger.ONE.shiftLeft(64);

    public static byte[] parseBigIntegerPositive(BigInteger b) {
        if (b.compareTo(BigInteger.ZERO) < 0)
            b = b.add(TWO_COMPL_REF);

       byte[] unsignedbyteArray= b.toByteArray();
        return unsignedbyteArray;
    }

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