2010-06-12 14 views
23

ho convertito un String-BigInteger come segue:come convertire BigInteger a String in Java

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

Ora voglio la mia stringa indietro. Sto usando m.toString() ma questo mi sta dando il risultato desiderato.

Perché ??? Dov'è il bug e cosa posso fare a riguardo?

+2

Se ho capito i vostri commenti a destra, il tuo msg non è necessariamente un numero Credo che la maggior parte di noi credeva che msg fosse pensato per essere la stringa che rappresenta un numero (come "12345"). Ma quello che vuoi fare è convertire "ciao" in qualche numero ed essere in grado di ricostruire nuovamente la stringa originale. chiedendo perché si vorrebbe farlo ... IMO convertire la stringa in BigInteger in questo modo ha senso solo se si vogliono fare calcoli con il numero risultante, ma poi la conversione non avrebbe senso. Cosa mi manca? – Axel

+0

in realtà sto facendo un programma su cryptosystem RSA ea tempo debito avevo bisogno di convertire msg in BigInteger (durante la registrazione) e di nuovo il processo inverso durante decription.but dovresti rispondere senza sapere il motivo per cui sto facendo perché ogni cosa puo ' essere spiegato qui – condinya

risposta

20

si desidera utilizzare BigInteger.toByteArray()

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

Il modo in cui ho capito è che si sta facendo le seguenti trasformazioni:

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

e si vuole il contrario:

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

Nota che probabilmente vuoi utilizzare gli overload di String.getBytes() e String(byte[]) che specifica una codifica esplicita, altrimenti potresti incorrere in problemi di codifica.

+3

Ho appena provato questo prima oggi e non sembra funzionare. Recupero un BigInteger dopo un po 'di conversioni, poi provo a farlo e mi ha dato una sequenza di dati inutili. –

+0

Non funziona !!! –

+0

Questo non funziona! – user3000430

6

Utilizzare m.toString() o String.valueOf(m). String.valueOf utilizza toString() ma è nullo.

+0

ho provato entrambi. Se il mio messaggio è ciao, in entrambi i modi ottengo il loro valore di BigInteger 448378203247. Ma voglio tornare indietro non il numero intero – condinya

+1

Se BigInteger rappresenta una stringa, non sembra che ci sia alcun valore nella conversione in un byte [] o BigInteger. Perché hai bisogno di farlo? – krock

8

Perché non usi il costruttore BigInteger(String)? In questo modo, il round-tripping tramite toString() dovrebbe funzionare correttamente.

(nota anche che la vostra conversione di byte non specifica esplicitamente una codifica dei caratteri ed è dipendente dalla piattaforma - che potrebbe essere fonte di dolore, più in basso la linea)

+1

se utilizzo come costruttore BigInteger (String) ottengo l'eccezione: java.lang.NumberFormatException – condinya

1

Per invertire

byte[] bytemsg=msg.getBytes(); 

è possibile utilizzare

String text = new String(bytemsg); 

utilizzando un solo BigInteger complica le cose, in realtà non è chiaro il motivo per cui si desidera un byte []. Cosa si sta pianificando con BigInteger o byte []? Qual è il punto?

0
String input = "0101"; 
BigInteger x = new BigInteger (input , 2); 
String output = x.toString(2); 
2

Quando si costruisce un BigInteger con una stringa, la stringa deve essere formattata come un numero decimale. Non è possibile utilizzare le lettere, a meno che non si specifica una radice nel secondo argomento, è possibile specificare fino a 36 nella radice. 36 fornirà solo caratteri alfanumerici [0-9, a-z], quindi se lo usi, non avrai alcuna formattazione. È possibile creare: nuova BigInteger ("ihavenospaces", 36) Poi per convertire indietro, utilizzare un .toString (36)

ma per mantenere FORMATTING: Usare i tasti [] metodo di byte che un paio di persone menzionati.Questo impacchetterà i dati con la formattazione nella dimensione più piccola e ti consentirà di tenere traccia del numero di byte facilmente

Questo dovrebbe essere perfetto per un programma di esempio di crittografia a chiave pubblica RSA, supponendo che tu mantenga il numero di byte nel messaggio inferiore al numero di byte di PQ

(mi rendo conto questa discussione è vecchio)

+0

Idea interessante! –

5

è inoltre possibile utilizzare la conversione implicita di Java:

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