2010-06-12 22 views
23

konwertowane do String do BigInteger następująco:jak przekonwertować BigInteger do String w Javie

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

Teraz chcę moje ciąg powrotem. Używam m.toString(), ale to daje mi pożądany rezultat.

Dlaczego ??? Gdzie jest błąd i co mogę z tym zrobić?

+2

Jeśli rozumiem komentarze rację, Twój MSG nie jest koniecznie liczba. Sądzę, że większość z nas wierzyła, że ​​msg miał być łańcuchem reprezentującym liczbę (np. "12345"). Ale to, co chcesz zrobić, to przekonwertować "hello" na pewną liczbę i ponownie odtworzyć oryginalny ciąg znaków. Zastanawiając się, dlaczego chcesz to zrobić ... IMO konwertując ciąg do BigInteger w ten sposób ma sens tylko wtedy, gdy chcesz wykonać obliczenia z uzyskaną liczbą, ale potem konwersja z powrotem nie miałaby sensu. czego mi brakuje? – Axel

+0

faktycznie robiłem program na kryptosystemie RSA iw odpowiednim czasie potrzebowałem przekonwertować msg do BigInteger (podczas zapisywania) i znowu odwrotny proces podczas deszyfrowania. Ale powinieneś odpowiedzieć na to, nie wiedząc, dlaczego tak robię, ponieważ wszystko może " t być wyjaśnione tutaj. – condinya

Odpowiedz

20

Chcesz użyć BigInteger.toByteArray()

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

The Way I rozumiemy to, że robisz następujące transformacje:

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

i chcesz Rewers:

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

Pamiętaj, że prawdopodobnie chcesz użyć przeciążenia w postaci String.getBytes() i String(byte[]), który określa jawne kodowanie, w przeciwnym razie mogą wystąpić problemy z kodowaniem.

+3

Właśnie wypróbowałem to wcześniej dzisiaj i to nie wydaje się działać. Wyszukuję BigInteger po kilku konwersjach, a następnie próbuję to zrobić i dałem mi sekwencję śmieci. –

+0

Nie działa !!! –

+0

To nie działa! – user3000430

6

Użyj m.toString() lub String.valueOf(m). String.valueOf używa toString(), ale ma wartość zerową.

+0

próbowałem obu.Jeśli moja wiadomość jest cześć, to w obu przypadkach otrzymuję ich wartość BigInteger 448378203247. Ale chcę przywitać się nie liczbą całkowitą – condinya

+1

Jeśli BigInteger reprezentuje ciąg, wtedy nie ma żadnej wartości w przekonwertowaniu go na bajt [] lub BigInteger. Dlaczego musisz to robić? – krock

8

Dlaczego nie używasz konstruktora BigInteger(String)? W ten sposób przełączanie w obie strony przez toString() powinno działać dobrze.

(uwaga również, że konwersja do bajtów nie jawnie określić kodowania znaków i jest zależne od platformy - które mogłyby być źródłem żalu dalej wzdłuż linii)

+1

Jeśli używam konstruktora BigInteger (String) otrzymuję wyjątek: java.lang.NumberFormatException – condinya

1

Aby odwrócić

byte[] bytemsg=msg.getBytes(); 

można użyć

String text = new String(bytemsg); 

użyciem BigInteger tylko komplikuje rzeczy, w rzeczywistości nie jest jasne, dlaczego chcesz byte []. Co planuje zrobić z BigIntegerem lub bajtem []? O co chodzi?

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

Podczas konstruowania BigInteger z ciągiem, ciąg musi być sformatowany jako liczba dziesiętna. Nie możesz używać liter, chyba że w drugim argumencie zostanie określona podstawa, możesz określić maksymalnie 36 w polu podstawowym. 36 da ci tylko znaki alfanumeryczne [0-9, a-z], więc jeśli użyjesz tego, nie będziesz miał formatowania. można tworzyć: nowy BigInteger ("ihavenospaces", 36) Następnie przekonwertować z powrotem, należy użyć .ToString (36)

ale żeby nie Formatowanie: Użyj byte [] sposób, że kilka osób wspomniało.To spakie dane z formatowaniem do najmniejszego rozmiaru i pozwoli na łatwe śledzenie liczby bajtów.

To powinno być idealne dla programu przykładowego klucza systemu kryptograficznego RSA, zakładając, że zachowasz liczbę bajtów w komunikat mniejsza niż liczba bajtów PQ

(zdaję sobie sprawę, ten wątek jest stary)

+0

Interesujący pomysł! –

5

można również użyć niejawna konwersja Javy:

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