2016-09-03 2 views
2

Je dois convertir un BigInteger en un entier non signé codé en format big-endian mais j'ai des problèmes car BigInteger.toByteArray renvoie une représentation signée. Comment puis-je convertir cette valeur en un format non signé?Comment obtenir un tableau d'octets non signé d'un BigInteger en Java?

(relativement) Contexte utiles

Je travaille sur un code qui utilise JNI pour avoir C++ appeler des méthodes Java pour gérer certaines fonctionnalités de chiffrement (ce qui est un fournisseur CNG Microsoft qui déleste certaines fonctionnalités Java) . J'ai la clé publique en Java et les valeurs BigInteger que j'ai besoin de convertir sont les coordinates of the Elliptic Curve Public Key. Selon le CNG documentation j'ai besoin de fournir ces points comme "entiers non signés codés en format big-endian".

Modifier

Avec le recul, cela aurait pu être un poste stupide. Je devenais confus avec des nombres négatifs et positifs et comment gérer cela (et parce qu'il est tard et mon esprit s'est transformé en bouillie) mais il s'avère que je n'ai pas besoin de traiter cela depuis le elliptic curve points won't be negative. Merci à tous ceux qui ont répondu ici! Je vais laisser cela au cas où cela aiderait quelqu'un d'autre. quelle est la différence

+2

Si entier en question est positive,? Si c'est négatif, alors quel devrait être le résultat de la conversion en non signé? –

+1

Jetez un oeil à [la réponse que j'ai donnée à une requête similaire] (http://stackoverflow.com/questions/38918190/how-to-get-the-2s-complement-value-of-a-biginteger-of- longueur arbitraire/38931124 # 38931124). –

+0

En d'autres termes, il s'agit d'un doublon de http://stackoverflow.com/q/38918190/95954 –

Répondre

1

Avec l'aide d'une valeur de référence du complément de 2, nous pouvons le faire comme ci-dessous

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; 
    } 
+0

Cela ne retourne pas la même valeur, n'est-ce pas? –

+0

@rudy Je pense que oui parce que ça donnera juste une version non signée du tableau d'octets –

+0

En ajoutant 1^64 à un BigInteger négatif? Oui, eh bien, si vous le tronquez à un entier non-uni, alors peut-être. Sinon, certainement pas. –