2010-06-12 5 views
23

I umgewandelt, um eine String-BigInteger BigInteger in String konvertieren, wie folgt:wie 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); 

Nun zurück ich meine Saite verzichten wollen. Ich verwende m.toString(), aber das gibt mir das gewünschte Ergebnis.

Warum ??? Wo ist der Fehler und was kann ich dagegen tun?

+2

Wenn ich Ihre Kommentare Recht, Ihre msg verstehen, ist nicht unbedingt eine Nummer. Ich glaube, die meisten von uns glaubten, dass msg die Zeichenfolge ist, die eine Zahl repräsentiert (wie "12345"). Aber was Sie tun möchten, ist "Hallo" in eine Zahl zu konvertieren und in der Lage sein, die ursprüngliche Zeichenfolge erneut zu rekonstruieren. Ich frage mich, warum du das machen willst ... IMO-Konvertierung von String in BigInteger macht auf diese Weise nur Sinn, wenn du Berechnungen mit der resultierenden Zahl machen willst, aber es dann nicht sinnvoll wäre, sie zurück zu konvertieren. Was vermisse ich? – Axel

+0

eigentlich mache ich ein Programm auf RSA-Kryptosystem und zu gegebener Zeit ich msg zu BigInteger konvertieren musste (während der Beschreibung) und wieder den umgekehrten Prozess während der Beschreibung.aber Sie sollten es beantworten, ohne den Grund zu wissen, warum ich tun, weil alles kann Das soll hier erklärt werden. – condinya

Antwort

20

Sie wollen BigInteger.toByteArray()

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

So wie ich es verstehen verwenden ist, dass Sie die folgenden Transformationen tun:

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

Und Sie wollen die Rückseite:

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

Beachten Sie, dass Sie wahrscheinlich Überladungen von String.getBytes() undverwenden möchten, die eine explizite Codierung angibt, andernfalls können Probleme bei der Codierung auftreten.

+3

Habe das heute schon früher versucht und es scheint nicht zu funktionieren. Ich erhalte einen BigInteger nach einigen Konvertierungen, versuche dann dies zu tun und es gibt mir eine Müllsequenz. –

+0

Funktioniert nicht !!! –

+0

Das funktioniert nicht! – user3000430

6

Verwenden Sie m.toString() oder String.valueOf(m). String.valueOf verwendet toString(), ist aber nullsicher.

+0

Ich versuchte beide. Wenn meine Nachricht Hallo ist dann bekomme ich auf beide Arten ihre BigInteger Wert 448378203247. Aber ich will hallo zurück nicht die ganze Zahl – condinya

+1

Wenn der BigInteger einen String darstellt dann scheint es keinen Wert bei der Umwandlung in ein Byte [] oder BigInteger. Warum musst du das tun? – krock

8

Warum verwenden Sie nicht den BigInteger(String) Konstruktor? Auf diese Weise sollte das Round-Triping über toString() funktionieren.

(beachten Sie auch, dass Ihre Umwandlung in Bytes nicht explizit ein Zeichencodierungs angeben und ist plattformabhängig - die weitere Quelle der Trauer auf der ganzen Linie sein könnte)

+1

Wenn ich wie BigInteger (String) -Konstruktor verwende, erhalte ich die Ausnahme: java.lang.NumberFormatException – condinya

1

Um

byte[] bytemsg=msg.getBytes(); 

umkehren Sie

String text = new String(bytemsg); 

mit einem BigInteger kompliziert nur Dinge verwenden können, in der Tat ist es nicht klar, warum wollen Sie ein byte []. Was ist mit dem BigInteger oder byte [] zu tun? Was ist der Sinn?

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

Wenn Sie einen BigInteger mit einer Zeichenfolge erstellen, muss die Zeichenfolge als Dezimalzahl formatiert sein. Sie können keine Buchstaben verwenden, es sei denn, Sie geben im zweiten Argument eine Radix an. Sie können bis zu 36 im Radix angeben. In 36 erhalten Sie nur alphanumerische Zeichen [0-9, a-z]. Wenn Sie dies verwenden, haben Sie keine Formatierung. Sie können erstellen: neue BigInteger ("ihavenospaces", 36) Dann zurück zu konvertieren, verwenden Sie einen .toString (36)

ABER FORMATIERUNG ZU HALTEN: Verwenden Sie die byte [] Methode, die ein paar Leute erwähnt.Das wird die Daten mit Formatierung in die kleinste Größe packen und Ihnen ermöglichen, die Anzahl der Bytes leicht zu verfolgen

Das sollte perfekt für ein RSA Public Key Crypto System Beispielprogramm sein, vorausgesetzt, Sie behalten die Anzahl der Bytes in der Nachricht kleiner als die Anzahl von Bytes von PQ

(ich weiß, dieser Thread ist alt)

+0

Interessante Idee! –

5

Sie auch Java implizite Konvertierung verwenden können:

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