web-dev-qa-db-fra.com

Comment convertir BigInteger en chaîne en java

J'ai converti une String en BigInteger comme suit:

Scanner sc=new Scanner(System.in);
System.out.println("enter the message");
String msg=sc.next();
byte[] bytemsg=msg.getBytes();
BigInteger m=new BigInteger(bytemsg); 

Maintenant, je veux récupérer ma ficelle. J'utilise m.toString() mais cela me donne le résultat souhaité.

Pourquoi? Où est le bug et que puis-je faire à ce sujet?

26
condinya

Vous voulez utiliser BigInteger.toByteArray()

String msg = "Hello there!";
BigInteger bi = new BigInteger(msg.getBytes());
System.out.println(new String(bi.toByteArray())); // prints "Hello there!"

Si j'ai bien compris, vous effectuez les transformations suivantes:

  String  -----------------> byte[] ------------------> BigInteger
          String.getBytes()         BigInteger(byte[])

Et vous voulez l'inverse:

  BigInteger ------------------------> byte[] ------------------> String
             BigInteger.toByteArray()          String(byte[])

Notez que vous souhaitez probablement utiliser les surcharges de String.getBytes() et String(byte[]) qui spécifient un codage explicite, sinon vous risquez de rencontrer des problèmes de codage.

25
polygenelubricants

Utilisez m.toString() ou String.valueOf(m). String.valueOf utilise toString () mais est null safe.

7
krock

Pourquoi n'utilisez-vous pas le constructeur BigInteger(String)? De cette façon, les allers-retours via toString() devraient fonctionner correctement.

(notez également que votre conversion en octets ne spécifie pas explicitement un codage de caractères et dépend de la plate-forme, ce qui pourrait être une source de problème plus tard) 

7
Brian Agnew

Vous pouvez également utiliser la conversion implicite de Java:

BigInteger m = new BigInteger(bytemsg); 
String mStr = "" + m;  // mStr now contains string representation of m.
7
Withheld

Lors de la construction d'un BigInteger avec une chaîne, celle-ci doit être formatée en tant que nombre décimal. Vous ne pouvez pas utiliser de lettres. Si vous ne spécifiez pas de base dans le deuxième argument, vous pouvez spécifier jusqu'à 36 dans la base. 36 ne vous donnera que des caractères alphanumériques [0-9, a-z], donc si vous l'utilisez, vous n'aurez pas de formatage. Vous pouvez créer: new BigInteger ("ihavenospaces", 36) Ensuite, pour reconvertir, utilisez un fichier .toString (36).

MAIS POUR CONSERVER LE FORMATAGE: Utilisez la méthode byte [] mentionnée par un couple de personnes. Cela compactera les données avec le formatage dans la plus petite taille et vous permettra de garder facilement une trace du nombre d'octets

Cela devrait être parfait pour un exemple de programme système de cryptographie à clé publique RSA, en supposant que le nombre d'octets dans le message soit inférieur au nombre d'octets de PQ.

(Je réalise que ce fil est vieux)

2
koZmiZm

Inverser

byte[] bytemsg=msg.getBytes(); 

vous pouvez utiliser

String text = new String(bytemsg); 

l'utilisation d'un BigInteger ne fait que compliquer les choses. En fait, il n'est pas clair pourquoi vous voulez un octet []. Que compte-t-on faire avec BigInteger ou byte []? Dans quel but?

1
Peter Lawrey
String input = "0101";
BigInteger x = new BigInteger ( input , 2 );
String output = x.toString(2);
0
Rayhanur Rahman

http://Java.Sun.com/j2se/1.3/docs/api/Java/lang/Object.html

chaque objet a une méthode toString () en Java.

0
Nils