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?
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.
Utilisez m.toString()
ou String.valueOf(m)
. String.valueOf utilise toString () mais est null safe.
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)
Vous pouvez également utiliser la conversion implicite de Java:
BigInteger m = new BigInteger(bytemsg);
String mStr = "" + m; // mStr now contains string representation of m.
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)
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?
String input = "0101";
BigInteger x = new BigInteger ( input , 2 );
String output = x.toString(2);
http://Java.Sun.com/j2se/1.3/docs/api/Java/lang/Object.html
chaque objet a une méthode toString () en Java.